Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem beim Dateiensuchen -> Unicode + Gesperrte Ordner (https://www.delphipraxis.net/91920-problem-beim-dateiensuchen-unicode-gesperrte-ordner.html)

ThE_-_BliZZarD 11. Mai 2007 23:02


Problem beim Dateiensuchen -> Unicode + Gesperrte Ordner
 
Ich führe ein Dateilisting mit folgender Methode durch.
Leider habe ich auf meiner Festplatte ein paar Dateien und ORDNER, deren Dateiname oder Ordnername
Unicode (Japanische Schriftzeichen) enthält. Das Listing versucht den Ordner zu öffnen, öffnet sich aber immer wieder
selbst (rekursiv..) und fährt sich dort fest.

Das gleiche passiert mit einem Systemordner, der ebenfalls "für den Publikumsverkehr geschlossen" ist.^^

Wie kann ich diese Fehler abfangen? Gibt es eine Funktion die Unicode erkennt? Und eine die blöde
nicht öffnen-bare Ordner erkennt? :?: :?:

Funktion (Ausschnitt):
Delphi-Quellcode:
if FindFirst('*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      Application.ProcessMessages;
      SetLength(ergebnisse, (Length(ergebnisse)+1));

      if ((searchResult.Attr and faDirectory) = faDirectory) then begin
         ergebnisse[i].is_directory := true;
         ergebnisse[i].name         := searchResult.Name;
         ergebnisse[i].size         := 0;
      end
      else begin
         ergebnisse[i].is_directory := false;
         ergebnisse[i].name         := searchResult.Name;
         ergebnisse[i].size         := searchResult.Size;
      end;
      Application.ProcessMessages;
      Inc(i);
    until FindNext(searchResult) <> 0;

    FindClose(searchResult);
end;
Edit: ich weiß, die Rekusivität is hier nicht zu sehen, aber hier in der if müsste etwas hin was diese blöden Sachen abfängt.

Luckie 11. Mai 2007 23:06

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
Du musst die Unicode API-Funktionen verwenden. Die VCL unterstützt so kein Unicode. Entweder nimmst du die TNT-Unicode Controls mit der TNT Unicode API Unterstützung oder du die entsprechenden Funktionen (FindFirstFileW) direkt (Sind schon in der Windows.pas deklariert.)

ThE_-_BliZZarD 11. Mai 2007 23:10

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
Also die FindFirst durch "FindFirstFileW" ersetzen?

Und die FindNext durch "FindNextFileW" oder was? muss ich was beachten? weil ich der Delphi7Hilfe stehen die Funktionen nicht :-(


Und was is mit dem Drecks-Systemordner?

Danke ;-)

himitsu 11. Mai 2007 23:54

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
Zitat:

Zitat von ThE_-_BliZZarD
Und die FindNext durch "FindNextFileW" oder was? muss ich was beachten? weil ich der Delphi7Hilfe stehen die Funktionen nicht :-(

Also mein D7 kennt FindNextFile (Menü > Hile > Windows SDK).
nur wie Luckie schon sagte hat's die VCL nicht so mit'm Unicode und da die von Borland Konsequent sind, gibt's auch fast kein Unicode in der WinAPI-Hilfe. (OK, im MSDN gibt's davon och nicht viel)

Allerdigns sind die Befehle gleich den ANSI-Versionen aufgebaut, nur halt die String als Wide...

oder du schaust einfach mal ins MSDN > MSDN-Library durchsuchenFindNextFileW

[add]
ich hoffe du hast i initialisiert?

Ansonsten ... wenn ich i umstelle und den Code kürze, dann kommt ja dieses raus
und einen Fehler kann ich da nicht entdecken, jedenfalls keinen welcher der ein "Festfahren"? erklären würde.
Delphi-Quellcode:
if FindFirst('*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      i := Length(ergebnisse);
      SetLength(ergebnisse, i + 1);
      ergebnisse[i].is_directory := (searchResult.Attr and faDirectory) = faDirectory;
      ergebnisse[i].name        := searchResult.Name;
      ergebnisse[i].size        := 0;
    until FindNext(searchResult) <> 0;
    FindClose(searchResult);
end;
Zitat:

Das Listing versucht den Ordner zu öffnen, öffnet sich aber immer wieder
selbst (rekursiv..) und fährt sich dort fest.
Aber wo ist hier was rekursiv und wo wird was geöffnet?

ThE_-_BliZZarD 12. Mai 2007 14:06

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
na, ich poste hier mal den kompletten Code.. ^^

Delphi-Quellcode:
function GetDirContents(pfad: String; prestr: String): Integer;
var
   searchResult : TSearchRec;
   ergebnisse: TSRDynArray;
   SL, tmp: TStringlist;
   i, j: integer;
begin
  i := 0;
  j := 0;

  SetLength(ergebnisse, 0);
  SetCurrentDir(pfad);

  FMain.AppendStringToFile(prestr+' Verzeichnis von '+pfad, pfad_zur_liste);
  FMain.AppendStringtoFile(prestr+' ', pfad_zur_liste);

  if FindFirst('*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      Application.ProcessMessages;
      SetLength(ergebnisse, (Length(ergebnisse)+1));

      if ((searchResult.Attr and faDirectory) = faDirectory) then begin
         ergebnisse[i].is_directory := true;
         ergebnisse[i].name         := searchResult.Name;
         ergebnisse[i].size         := 0;
      end
      else begin
         ergebnisse[i].is_directory := false;
         ergebnisse[i].name         := searchResult.Name;
         ergebnisse[i].size         := searchResult.Size;
      end;
      Application.ProcessMessages;
      Inc(i);
    until FindNext(searchResult) <> 0;

    // Must free up resources used by these successful finds
    FindClose(searchResult);
    for i := 0 to (Length(ergebnisse)-1) do begin
       Application.ProcessMessages;
       if (ergebnisse[i].is_directory) then begin
          if ((ergebnisse[i].name <> '.') AND (ergebnisse[i].name <> '..')) then begin
            Application.ProcessMessages;
            GetDirContents(pfad+ergebnisse[i].name+'\', prestr+'  ');
            SetCurrentDir(pfad);
          end;
       end
       else begin
          Application.ProcessMessages;
          FMain.AppendStringtoFile(prestr+'  - '+ergebnisse[i].name+' '+IntToStr(ergebnisse[i].Size)+' Bytes', pfad_zur_liste);
       end;
    end;
    Application.ProcessMessages;
    FMain.AppendStringtoFile(prestr+' ', pfad_zur_liste);
  end
  else begin
     FMain.AppendStringtoFile(prestr+' Keine Elemente.', pfad_zur_liste);
     FMain.AppendStringtoFile(prestr+' ', pfad_zur_liste);
  end;
  Result := 0;
end;
Hier wird die Funktion aufgerufen:
Delphi-Quellcode:
GetDirContents('F:\', '');

ThE_-_BliZZarD 14. Mai 2007 18:17

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
Hat keiner eine Idee?

Und das mit den WinAPI Funktionen hab ich nicht ganz verstanden.. Kann das jemand mal bitte etwas genauer erläutern?

Was muss ich tun damit Unicode verwendet werde kann?

Mackhack 14. Mai 2007 22:17

Re: Problem beim Dateiensuchen -> Unicode + Gesperrte Ord
 
Zitat:

Zitat von ThE_-_BliZZarD
Hat keiner eine Idee?

Und das mit den WinAPI Funktionen hab ich nicht ganz verstanden.. Kann das jemand mal bitte etwas genauer erläutern?

Was muss ich tun damit Unicode verwendet werde kann?

Zitat:

Zitat von Luckie
... oder du die entsprechenden Funktionen (FindFirstFileW) direkt (Sind schon in der Windows.pas deklariert.)



Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz