Delphi-PRAXiS
Seite 5 von 8   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rekursives durchsuchen und Letzten Dateizugriff auslesen (https://www.delphipraxis.net/150387-rekursives-durchsuchen-und-letzten-dateizugriff-auslesen.html)

DeddyH 16. Apr 2010 13:49

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Zeig doch einmal die ganze aufrufende Methode, nicht nur Häppchen davon.

hoika 16. Apr 2010 13:53

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Hallo,

Breakpoint auf

List.Add(Directory+SR.Name+'#'+IntToStr(SR.FindDat a.nFileSizeHigh)+'*'
+IntToStr(SR.FindData.ftLastAccessTime.dwLowDateTi me));

und Laufenlassen.


Hast du mal c:\test wie im Bsp. von DeddyH angelegt
und ein paar Dateien reingepackt.

Du verschweigst uns den Code, der nach dem Aufruf kommt,

Vielleicht steht dort ja auch ein List.Clear ;)



Heiko

DeddyH 16. Apr 2010 14:00

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Ich hab die Klassenmethode jetzt mal auf das Notwendigste gekürzt, auch wenn das vermutlich nicht fehlerverursachend war:
Delphi-Quellcode:
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);

    procedure ScanDir(const Directory: string);
    var SR  : TSearchRec;
    begin
      if FindFirst(Directory+'*.*',faAnyFile,SR) = 0 then
      begin
        try
          repeat
            if (SR.Attr and faDirectory) = faDirectory then
            begin
              if (SR.Name <> '.') and (SR.Name <> '..') then
                ScanDir(IncludeTrailingPathDelimiter(Directory+SR.Name));
            end
            else
            begin
              List.Add(Directory+SR.Name+'#'+IntToStr(SR.FindData.nFileSizeHigh)+'*'
                     +IntToStr(SR.FindData.ftLastAccessTime.dwLowDateTime));
            end;
          until FindNext(SR) <> 0;
        finally
          FindClose(SR);
        end;
      end;
    end;

begin
  List.BeginUpdate;
  try
    if ClearList then
    begin
      List.Clear;
    end;
    Directory := trim(Directory);
    if Directory = '' then
    begin
      Exit;
    end;
    Directory := IncludeTrailingPathDelimiter(Directory);
    ScanDir(Directory);
  finally
    List.EndUpdate;
  end;
end;

AnyKey 16. Apr 2010 14:02

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Der Code ist ziemlich lang, hab noch mal drüber geguckt und es ist kein List.Clear drin ^^ aber was ich rausgefunden habe ist, dass er nicht einmal was in die Liste schreibt, so wie ich es die ganze Zeit schon vermutet habe.

Delphi-Quellcode:
var LastAccess : Array of string;
var List      : TStringList;
var Path      : string;
var i         : Integer;
begin
  List := TStringList.Create;
  Main.UniConnection1.Connect;
  if Main.UniConnection1.Connected = True then
  begin
    Main.UniQuery1.SQL.Clear;
    Main.UniQuery1.SQL.Add('SELECT Pfad FROM tblPfad;');
    Main.UniQuery1.Execute;
    Path := Main.UniQuery1.Fields[0].Value;
  end;
  TDataWork.GetAllFilesInDirectorys(Path,List,true);
  setLength(LastAccess,List.Count-1);
  for i := 0 to List.Count-1 do
  begin
    LastAccess[i] := TDataWork.GetLastAccesstime(List.Strings[i]);
  end;
  FreeAndNil(List);
Hab mich mal aufs wesentliche beschränkt.

DeddyH 16. Apr 2010 14:15

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Wie ist es so?
Delphi-Quellcode:
var LastAccess : Array of string;
    List      : TStringList;
    Path      : string;
    i         : Integer;
begin
  Path := '';
  try
    fMain.UniConnection1.Connect;
  except
    MessageBox(0,'Datenbankverbindung fehlgeschlagen!','Fehler',MB_ICONWARNING);
  end;
  if fMain.UniConnection1.Connected{ = True} then
  begin
    fMain.UniQuery1.SQL.Text := 'SELECT Pfad FROM tblPfad';
    fMain.UniQuery1.{Execute;}Open;
    Path := fMain.UniQuery1.Fields[0].Value;
    fMain.UniQuery1.Close;
  end;
  if Path <> '' then
    begin
      List := TStringList.Create;
      try
        TDataWork.GetAllFilesInDirectorys(Path,List,true);
        setLength(LastAccess,List.Count{-1});
        for i := 0 to List.Count-1 do
        begin
          LastAccess[i] := TDataWork.GetLastAccesstime(List{.Strings}[i]);
        end;
      finally
        FreeAndNil(List);
      end;
    end;

AnyKey 16. Apr 2010 14:26

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Ich begreifs einfach nicht, selbst wenn ich den Pfad fest in den Code schreibe funktioniert es nicht. die Liste bleibt leer und ich bekomme bei dem Aufruf von List.Count einen Fehler.

Ich bin am verzweifeln...

Danke noch mal für eure Hilfe!!

Ich hoff mal ich bekomm das mit eurer Hilfe hin!

Edit: Ich hab jetzt mal spasseshalber ein Memo drauf gelegt und dem List zugewiesen, ratet mal was passiert....... es bleibt leer

Gruß
AnyKey

DeddyH 16. Apr 2010 14:29

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Zitat:

Zitat von AnyKey
ich bekomme bei dem Aufruf von List.Count einen Fehler.

Das ist in der Tat bemerkenswert. Jetzt nimmst Du Dir mal die komplette Routine (ungekürzt), packst sie in eine Textdatei und hängst sie hier an, vielleicht sieht man dann, was da schiefgeht.

hoika 16. Apr 2010 14:34

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Hallo,

Zitat:

die Liste bleibt leer und ich bekomme bei dem Aufruf von List.Count einen Fehler
Ist ja interessant, dass du das jetzt erst sagst ... ;)
Ist die Fehlermeldung geheim oder warum sagst du sie uns nicht ?

Steht die vielleicht irgendwo ein List.Free ?;


*auf die Textdatei wart*


Heiko

AnyKey 16. Apr 2010 14:37

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Fehler sagt lediglich 'Fehler bei Bereichsprüfung' und er kommt sobald ich dem Array List.Count-1 zuweisen will, was ja nicht gehen kann, da List.Count = 0 ist, obwohl es das ja nicht sein dürfte wenn ich die liste gefüllt habe...

Edit: wie schon gesagt, die Proceduren liegen in zwei verschiedenen Units, die GetAllFilesInDirectory in einer Klasse und der Button zum auslösen in einem Fromular.

DeddyH 16. Apr 2010 14:42

Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
 
Wieso die Liste leer bleibt, hab ich nicht erkennen können, aber das SetLength ist so auf jeden Fall falsch. Wieso List.Count - 1 und nicht List.Count?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
Seite 5 von 8   « Erste     345 67     Letzte »    

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