ERROR_ACCESS_DENIED50x5 bei FindFirstFile()
-
Hallo,
ich habe folgendes Problem: ich versuche mir die Dateien eines vorgegebenen Verzeichnis auflisten zu lassen.
WIN32_FIND_DATA FindFileData; HANDLE hFind; if ( ( hFind = FindFirstFile( StringConvT( folderBrowserDialog1->SelectedPath , &FindFileData ) ) != INVALID_HANDLE_VALUE) { do { richTextBox1->AppendText ( GetLastError() +"\n" ); richTextBox1->AppendText ( gcnew String(FindFileData.cFileName)+"\n" ); } while (FindNextFile(hFind, &FindFileData) != 0); richTextBox1->AppendText ( GetLastError() +"\n" ); FindClose(hFind); }Das Ganze liefert 3 Ausgaben: "5"( ERROR_ACCESS_DENIED50x5 ), den Namen des gewählten Verzeichnisses und "18" ( ERROR_NO_MORE_FILES180x12 ).
Da es auf verschiedenen Rechnern das selbe Problem gibt ( XP, Vista, mit und ohne Benutzerkontensteuerung ) liegt es wohl sicher an dem Code oder irgendwelchen Project-Properties. Kann mir da jemand weiterhelfen?Vielen Dank, Henry
PS Ich arbeite mit Visual C++ 2008.
-
1. GetLastError ist irrelevant, denn FindFirstFile liefert einen Wert != INVALID_HANDLE_VALUE!
Also hast Du eine Datei gefunden...
2. Und weitee Dateien etsprechen eben nicht Deiner Maske...Mich würde eher interessieren mit was für Werten Du FindFirstFile fütterst.
Initialisierst Du FindFileData überhaupt. In Deinem Code sehe ich nichts davon!
-
FindFileData ist m. E. nur "out" Parameter. Initialisierung wäre schön, aber nicht nötig.
Simon
-
Stimmt. Ich meinte was stehtin folderBrowserDialog1->SelectedPath?
Hast Du auch Wildcards drin? Sonst bekommst Du evtl. wirklich nur das Verzeichnis. und nicht dessen Inhalt.
-
Um alle Dateien eines Ordners zu finden, sollte folderBrowserDialog1->SelectedPath auch die entsprechenden Wildcards (.) enthalten (wie Martin es schon geschrieben hat). Wird nur der Ordnername verwendet, dann gibt es genau eine Entsprechung (sofern der Ordnername existiert).
GetLastError "5" stammt von einem vorherigen API-Aufruf. Fehlercodes werden erst aktualisiert, wenn in einem Funktionsaufruf auch ein Fehler auftritt. In Deinem Beispiel erfolgt das erst, wenn FindNextFile nichts mehr findet. Mit SetLastError(ERROR_SUCCESS) lässt sich der Fehlercode auch explizit zurücksetzen.
-
Beachte auch: Du hast hier C++/CLI!!!
Da sind die Werte von GetLastError ungültig, wenn die Funktion via IJW oder DllImport aufgerufen wurde!!! (was bei Dir der Fall ist)Bleibe bitte in *einer* Welt: Verwende System::IO::Directory::GetFiles...
-
Vielen Dank für eure Antworten!
Ich habe einiges versucht, der entscheidende Tip kam dann von Jochen. Mit "Directory::GetDirectories" kann ich das Ganze sehr schön lösen ohne irgendwelche Handstände machen zu müssen.
Danke nochmal an alle und besonders Jochen.
Henry
-
Bleibe bitte in *einer* Welt:
Freut mich, dass wenigstens einer noch diese Meinung vertritt. Ich dachte schon bald ich sei der einzige und alle anderen mischen wies grad geht...
Simon
-
Warum auch mischen? WinAPI und MFC haben doch alles, was man so braucht.

-
Nanana... übertreiben brauchst Du auch nicht... oder Du hast noch nicht mit C# gearbeitet

-
Habe ich noch nicht... und werde ich auch nicht.
