Filenames aus dem Openfile Dialog auslesen
-
Hi, ich habe ein Problem ich hab nen OpenFileDialog und dort möchte ich alle ausgewählten Items in eine ListBox eintragen (sozusagen ne for-schleife).
Nur weis ich nicht wie ich das innem Array speichern soll. Wäre nett wenn ihr mir helfen konntet:
void AddItem(HWND hwnd, HINSTANCE hInstance, HWND ListHWND) { char szFileName[MAX_PATH]; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); szFileName[0] = 0; FileTitle[0] = 0; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = szFileName; ofn.lpstrTitle = "Dateien auswählen"; ofn.lpstrFilter = "Alle Dateien (*.*)\0*.*"; ofn.nMaxFile = MAX_PATH; ofn.lpstrDefExt = "*.*"; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT; if(GetOpenFileName(&ofn)) { GetFileTitle(szFileName, FileTitle, sizeof(FileTitle)); SendMessage(ListHWND,LB_ADDSTRING,0,(WPARAM)FileTitle); ListBoxItems++; } } void Save() { if(ListBoxItems != 0) { /* std::ofstream output("files.txt"); output.write((char*)FileTitle, sizeof(FileTitle)); output.close();*/ } else MessageBox(hwnd, "Es sind keine Einträge vorhanden!", "Warnung", MB_OK | MB_ICONWARNING); }
-
Wo hast du denn die Variable "FileTitle" angelegt? Regulär trägt der Dialog in lpstrFile den/die Namen (samt Pfad) der gewählten Datei(en) ein - bei Mehrfachauswahl durch '\0' getrennt:
for(char* fname = szFileName+ofn.nFileOffset;*fname!='\0';fname+=strlen(fname)+1) mach was(aber das hätte dir auch ein tieferer Blick in die MSDN Erklären können)
-
Die hab ich Global erstellt.
Ich hab die MSDN aufm PC und hab mich da ein bissn totgesucht aber egal. Ich schau zuerst immer in die MSDN. Aber um genau zu wissen wonach ich suche, muss ich das auch erstmal lernen.
Thx für deine Hilfe hat mir echt geholfen.
Jetz stellt sich für mich noch die Frage, wie ich ne for Schleife schreiben muss, damit er PRO Listeintrag den Inhalt in die Datei schreibt. Vllt kannste mir da noch helfen.
for(int i=0; i<ListBoxItems; i++) { char CurrentFile[256]; //Hier der Code std::ofstream output("files.txt"); output.write((char*)CurrentFile, sizeof(CurrentFile)); output.close(); }€dit: Listboxitems ist eine bereits Global deklarierte Variable (Global nur zum Testzweck, vllt gehts auch anders)
-
Nolf schrieb:
Ich hab die MSDN aufm PC und hab mich da ein bissn totgesucht aber egal. Ich schau zuerst immer in die MSDN. Aber um genau zu wissen wonach ich suche, muss ich das auch erstmal lernen.
Also wenn ich in der MSDN nach OPENFILENAME suche, bekomme ich eine recht ausführliche Beschreibung der einzelnen ofn-Member und wie GetOpenFileName() mit ihnen interagiert

Jetz stellt sich für mich noch die Frage, wie ich ne for Schleife schreiben muss, damit er PRO Listeintrag den Inhalt in die Datei schreibt. Vllt kannste mir da noch helfen.
So wie ich es dort oben geschrieben habe - anstelle des 'mach was' mußt du halt den entsprechenden Dateinamen nehmen und verarbeiten.
Zur Erklärung - die Dateinamen stehen etwa so in deinem Array:
C:\Testdir\file1.txt#file2.txt#file3.txt## ^(# steht dabei für das '\0', das als Trennzeichen verwendet wird)
Außerdem steht in nFileOffset der Index, an dem der Dateipfad zu Ende ist und der Dateiname beginnt (dort oben mit ^ markiert).Die for()-Schleife beginnt beim ersten Dateinamen der Liste - in jeder Runde springt der Zeiger auf den Anfang des nächsten Dateinamens (str+strlen(str) zeigt auf den '\0'-Terminator von str, str+strlen(str)+1 auf das Zeichen dahinter - also den nächsten String der Liste).
-
Ja aber so kompliziert brauch ich es doch nicht. Wie siehts aus, wenn ich ne forschleife laufen lasse, die alle ListBox Items durchgeht und speichert nur leider gibt es nicht soetwas wie ne Message wie:
WM_GETLISTBOXITEMS oder ähnlich.
Dies in einer Variable zu speichern erscheind mir etwas verwirrend.
-
Nein, aber es gibt LB_GETITEMDATA
(reicht das für deine Zwecke?)btw - die ListBox mußt du trotzdem noch füllen, bevor du sie verwenden kannst.
-
Jau genau aber die Listbox ist schon gefüllt aber LB_GETITEMDATA ist sicher das richtige.
thx