Findfirstfile - \\ und \ Problem wie lösen?
-
Hallo Leute, habe mich mal dazu durchgerungen mit dem Borland c++ Compiler anzufangen, in Delphi bin ich ziemlich fit.
Jetzt eine frage:
Mein code sieht folgendermaßen aus:fHandle=FindFirstFile("c:\\Lager\\*.bmp",&wfd);funzt auch einwandfrei, allerdings will ich den dir in einer Variablen festlegen.
Mit
SelectDirectory("Select directory", WideString(root), dir)kann ich zwar den Pfad schön selbst festlegen und in dir ablegen, allerdings eben nur mit EINFACHEN \ und nicht mit den geforderten \\ für FindFirstFile.
gibt es vielleicht eine Funktion die ähnlich zu FindFirstFile arbeitet aber mti einfachen \?
Oder eine Funktion die Ähnlich zu SelectDirectory arbeitet, aber mit doppelten \?
Vielen Dank im Vorraus für die Beantwortung dieser garantiert super-trivialen Frage!
-
Dir fehlen anscheinend Grundlagen in C/C++.
Nur so viel:
FindFirstFile erwartet immer nur einen Backslash. Genau das machst du in deinem ersten Beispiel.
-
Grundlagen sind vorhanden, allerdings nur reine Command-Line-Grundlagen, keinerlei Windows-Api´s usw.
Findfirstfile funktioniert NUR mit 2 Backslashes, mit einem klappt das ganze nicht. Daher die Frage wie ich das beheben kann.
edit: das ganze soll so arbeiten:
fHandle=FindFirstFile(dir,&wfd);wobei in der dir-Variable zuerst steht "c:\Lager\" (eingelesen durch SelectDirectory)
ergängt wird das ganze dann durch die Maske mit StrCat oder ähnlichem.
edit2: nochwas: wfd ist vom typ WIN32_FIND_DATA wfd
hängt es damit zusammen vielleicht?
-
JKuehl schrieb:
Grundlagen sind vorhanden, allerdings nur reine Command-Line-Grundlagen, keinerlei Windows-Api´s usw.
Findfirstfile funktioniert NUR mit 2 Backslashes, mit einem klappt das ganze nicht. Daher die Frage wie ich das beheben kann.
Diese beiden Sätze widersprechen sich.
Nochmal: FindFirstFile erwartet einen Pfad, der von einzelnen Backslashes getrennt ist, nicht von doppelten. Und genau das übergibst du in deinem ersten Beispiel.
-
das dachte ich ja auch...
hier der funktionierende Code:
void __fastcall TForm1::FormCreate(TObject *Sender) { String dir = "", root = ""; // "c:" if (SelectDirectory("Select directory", WideString(root), dir)) Edit1->Text = dir; fHandle=FindFirstFile("c:\\Lager\\*.bmp",&wfd); FindNextFile(fHandle,&wfd); // damit wird auch das .. rausgeworfen while (FindNextFile(fHandle,&wfd)) ListBox1->Items->Add(wfd.cFileName); }setze ich
fHandle=FindFirstFile("c:\Lager\*.bmp",&wfd);ein, funktioniert das ganze nichtmehr!
in dir steht z.b. "c:\Lager"
ich versteh nicht wo der Fehler liegen kann.. WIN32_FIND_DATA ist eine structure, die einen terminierten String in cFileName ablegt.
-
Das \-Zeichen hat in C++-Strings eine besondere Bedeutung, Stichwort escape-Sequenzen. Du kennst sicher "\n"; das wird vom Compiler in einen Zeilenumbruch umgewandelt. "\" wandelt der Compiler nun in einen einzelnen Backslash um.
Daher übergibst du mit '\' einzelne Backslashes.Ein doppelter Backslash wäre "\\\". Diese Escape-Sequenzen existieren nur auf Compiler-Ebene. Wenn dein Programm vom User oder aus einer Datei einen String einliest, reicht ein Backslash.
-
arghl .. das kommt davon wenn man Delphi gewohnt ist und sich dann wieder an c-Syntax erinnert... bekannte Stolperfalle = und == ....
Aber an \ in Strings hab ich jetzt garnicht gedacht...dann bau ich mal das ganze um , dann musses ja funzen

-
DIE LÖSUNG
void __fastcall TForm1::FormCreate(TObject *Sender) { String dir = "", root = ""; // "c:" if (SelectDirectory("Select directory", WideString(root), dir)) dir +="\\*.bmp"; fHandle=FindFirstFile(dir.c_str(),&wfd); FindNextFile(fHandle,&wfd); // damit wird auch das .. rausgeworfen while (FindNextFile(fHandle,&wfd)) ListBox1->Items->Add(wfd.cFileName); }eine einfache Stringerweiterung um die Maske "\*.bmp" sowie eine Typumwandlung in c_char -- > fertisch.
Vielen Dank für die Denkanstoß
