Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Sa 01.11.08 10:26 
Hallo!

ich versuche eine Funktion zu schreiben, die mir eine Liste aller Unterordner eines Verzeichnisses liefert. Da auch Unicode-Namen berücksichtigt werde sollen will ich mit FindFirstFileW arbeiten. Hierzu finden sich allerlei Beiträge in denen Suchprozeduren mit FindFirstFileW implementiert werden. Bei mir will das Ganze aber nicht so recht funktionieren, da FindFirstFileW einfach nichts findet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function GetSubDirList(Path: String; Recurse: boolean = true) : TStrings;
var
  hFind: THandle;
  FindFileData: WIN32_FIND_DATAW;
  i: integer;
begin
  Result:=TStringList.Create;

  //hFind := FindFirstFileW(pointer(Path+'*.*'), FindFileData);
  //hFind := FindFirstFileW(PWideChar(Path+'*.*'), FindFileData);
  hFind := FindFirstFileW(PWideChar(Path), FindFileData);
  
  if hFind = INVALID_HANDLE_VALUE then begin
    ShowMessage('Nichts gefunden...');
  end else try
    repeat
      ...
    until FindNextFileW(hFind,FindFileData) = false;
  finally
    Windows.FindClose(hFind);
  end;

  if recurse then begin
    ...
  end;
end;


Das Problem ist, dass egal was ich versucht habe immer "Nichts gefunden..." ausgegeben wird, hFind ist nach dem Aufruf von FindFirstFileW also ein ungültiges Handle...

Der Pfad mit dem ich die Prozedur zum testen aufrufe, "C:\Test\" existiert definitiv und enthält auch einige Dateien. Wie muss ich FindFirstFileW aufrufen, damit auch was gefunden wir?

Besten Dank
Ares
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Sa 01.11.08 10:39 
Zitat:
PWideChar(Path)


wenn Path ein String ist wird nur unter Delphi 2009 funktionieren.
Unter Delphi < 2009 solltet du dir die vom Compiler erzeugte Warnung mal durchlesen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 01.11.08 10:42 
Versuch es mal so:
ausblenden Delphi-Quelltext
1:
hFind := FindFirstFileW(PWideChar(WideString(Path)), FindFileData);					
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Sa 01.11.08 10:48 
user profile iconBernhard Geyer hat folgendes geschrieben Zum zitierten Posting springen:

wenn Path ein String ist wird nur unter Delphi 2009 funktionieren.
Unter Delphi < 2009 solltet du dir die vom Compiler erzeugte Warnung mal durchlesen!


Ok, die Compiler Warnung hatte ich übersehen... Wieso wäre das unter Delphi 2009 anders? Ich weiß zwar, dass dort die Unicode-Unterstützung start verbessert wurde, aber wie wirkt sich das auf Strings auch. Können diese dort auch Unicode-Daten enthalten?


user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Versuch es mal so:
ausblenden Delphi-Quelltext
1:
hFind := FindFirstFileW(PWideChar(WideString(Path)), FindFileData);					


Danke, das funktioniert prima!
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Sa 01.11.08 12:12 
user profile iconAres hat folgendes geschrieben Zum zitierten Posting springen:
Wieso wäre das unter Delphi 2009 anders? Ich weiß zwar, dass dort die Unicode-Unterstützung start verbessert wurde, aber wie wirkt sich das auf Strings auch. Können diese dort auch Unicode-Daten enthalten?

Bis D2007 ist String = Ansistring (und PChar = PAnsiChar)
ab D2009 ist String = Unicodestring (und PChar = PWidechar)

Und damit passt es für dein beispiel.