![]() |
Rekursives durchsuchen und Letzten Dateizugriff auslesen
Hallo,
ich habe folgendes Problem, ich will einen Ordner rekursiv durchsuchen und für alle gefundenen Dateien den Letzten Zugriff auslesen. Die Funktion sieht folgendermaßen aus:
Delphi-Quellcode:
Die Frage ist jetzt wo muss ich die mit => gekennzeichnete schleife hinpacken, damit ich die Liste durchgehen kann und ich den Letzten Dateizugriff für alle Listeneinträge auslesen kann.
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);
var LastAccess : string; var i : Integer; procedure ScanDir(const Directory: string); var Mask : string; var SR : TSearchRec; begin // ToDo: Mask := '*.*'; if FindFirst(Directory+Mask,faAnyFile and not faDirectory, SR) = 0 then begin try repeat List.Add(Directory+SR.Name); until FindNext(SR) <> 0; finally FindClose(SR); end; end; if FindFirst(Directory+Mask,faAnyFile,SR) = 0 then begin try repeat if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then begin ScanDir(Directory+SR.Name+'\'); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; begin List.BeginUpdate; try if ClearList then begin List.Clear; end; if Directory = '' then begin Exit; end; if Directory[Length(Directory)] <> '\' then begin Directory := Directory+'\'; end; Directory := Directory+'\'; ScanDir(Directory); // muss das Auslesen der AccessTime hier gemacht werden? überprüfen!!!! => for i := 0 to List.Count - 1 do => begin => LastAccess := GetLastAccessTime(List.Strings[i]); => end; finally List.EndUpdate; end; end; Hoffe es kann jemand helfen! Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ich glaube das sinnvollste ist wenn der versuchst den aktuellen Quelltext zu verstehen. Wenn du soweit bist hat sich die eigentliche Frage erledigt.
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
erstmal ein paar Fragen:
Wozu 2 Schleifen, zum Auslesen des Ordners? Es wird beide Male mit der selben Maske gesucht, demnach könnte man Dateien und Ordner im selben Surchgang suchen. Zitat:
FindFirst und FindNext stellen dieses Datum doch auch zur Verfügung. Ansonsten bin ich Bärchens Meinung. Schau dir vorallem mal folgende Punkte an: - den Typ von LastAccess - Rückgabewert von GetLastAccessTime wirklich ein String? - und was willst du überhaupt mit dem Datum machen - den Nutzen der Variable Mask - und dann auch noch das: Zitat:
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ok, und wie komme ich an dieses Datum dann dran? Wie müsste ich die beiden Schleifen umbauen um nur noch eine zu haben, muss zugeben ich habe den Quellcode aus dem internet kopiert, blick also noch nich so ganz durch, wäre nett wenns mir mal einer kurz erklären könnte.
Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Also, GetlastAccessTime gibt wirklich einen String zurück.
Also passt der Typ von LastAccess auch. Das Datum muss mit einem anderen Datum verglichen werden. Wie kann ich die funktion verbessern und wie komme ich wie du gesagt hast leichter und besser an das Datum des letzten Dateizugriffs heran? Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Bitte unterlasse das Pushen von Beiträgen innerhalb von 24 Stunden. :)
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Danke für den hinweis, werds berücksichtigen ;) hilft mir aber nich weiter... :P
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Hallo,
wo ist überhaupt das Problem ? Du hast eine gefüllte Liste nach ScanDir(Directory); mit Dateinamen und willst jetzt von jeder Datei das letzte Zugriffsdatum ? Heiko |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Genau, das ist mein Problem, außerdem muss ich dann zu jeder Datei den Ersteller auslesen, das wird dann alles in eine Datenbank geschrieben.
Wäre super wenn mir jemand dabei helfen könnte, ich blick im moment garnicht mehr durch. Edit: Ok, ich habe einen neuen Plan, ich mach das mit dem LastAccess nachdem ich die Pfade durch die Rekursive suche ausgelesen habe, nur ist jetzt die Frage wie komme ich an die Pfade ran? Eine Andere frage wäre noch wie ich dabei oder danach dann auch die Dateigröße/Ordnergröße herausfinden kann. Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Meiner Meinung nach hast Du 2 Möglichkeiten:
wobei die erste Möglichkeit duch das mehrmalige Anpacken der Datei natürlich langsamer ist. Gruß K-H edith: Zitat:
Zitat:
Die "Dateigröße" (Summe der Größe der enthaltenen Dateien) bei Verzeichnissen mußt Du allerdings selbst errechnen! |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Wie bekomme ich das hin, die Dateien mit Pfaden in eine Stringlist zu schreiben? Beim debuggen habe ich festgestellt das in GetAllFilesInDirectory scheinbar garnichts in die Liste geschrieben wird. Als ich das ganze aber mit einer ListBox probiert habe standen da die Dateien drin.
Und wie mache ich das, dass ich die Dateigröße auslesen kann? Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
:glaskugel: Du musst Zeile 34 ändern. Und schau Dir die Routine noch einmal genau an. Wenn eine Datei gefunden wird, musst Du halt zusätzlich zu TSearchRec.Name noch TSearchRec.Size auslesen.
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ist TSearchRec.Time dann die Zeit des letzten Zugriffs? Dann müsste ich nur drei oder eine Liste/n übergeben und die Werte da reinschreiben richtig? Dann könnte ich sie in meine Datenbank schreiben und später damit arbeiten. Das Problem ist nur das mit der Übergabe der liste, irgendwie steht da nichts drin wenn ich eine StringList übergebe. Hat da vielleicht jemand eine Idee?
Was genau meinst du mit Zeile 34? die Schleife in der ich die LastAccessTime auslesen wollte? Das habe ich schon raus genommen. Edit: Vorallem, wie sieht die Time dann überhaupt aus? Da sind ja keine Punkte drin oder? Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Das mit Zeile 34 war ironisch gemeint, da Du uns vorenthältst, wie Du die Routine aufrufst. Und an die Zeitangaben kommst Du auf jeden Fall über TSearchRec.FindData (was einem
![]() ![]() |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Aso ^^ ok also der Procedure kopf sieht folgendermaßen aus:
Delphi-Quellcode:
Der Aufruf der Funktion dann so:
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);
procedure ScanDir(const Directory: string); var Mask : string; var SR : TSearchRec; begin
Delphi-Quellcode:
=> List ist eine Stringliste
TDataWork.GetAllFilesInDirectorys(Pfad,List,true);
Ist Size denn dann die Dateigröße oder muss ich SR.FindData.nFileSizeHigh nehmen? wo ist bei FileSize und DateTime der Unterschied zwischen High und Low? Den Ersteller einer Datei kann ich darüber aber nicht auslesen soweit ich das gesehen habe oder? Danke für eure Hilfe und Geduld! Edit: ich brauch echt hilfe, komm überhaupt nicht weiter... :( wie muss ich die Liste übergeben, damit sie gefüllt wird? Wenn ich diese Werte ausgelesen habe klappt der rest denke ich! Nur wie man den Ersteller einer Datei ausliest muss ich noch rausfinden, bzw. testen! Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Zitat:
Und was den Ersteller/Besitzer angeht dann such mal unter dem Stichwort Active Directory oder ADS. Gruß K-H P.S. Wenn Du Deinen Sourcecode als Staatsgeheimnis behandelst, ist es recht schwer Dir vernünftig zu helfen. |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Wozu verlinke ich die Hilfe, wenn diese dann nicht gelesen wird? Und eine Zeitangabe enthält keine Punkte, egal, ob als FileTime oder TDateTime, da es sich um Zahlen handelt. Die Punkte kommen erst bei deren Darstellung ins Spiel, welche man ja z.B. mit FormatDateTime beeinflussen kann.
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Habe mir die Hilfe durchgelesen, war auch so schlau mal in die Delphi Hilfe zu gucken. Naja ich kenn mich mit den sachen halt nicht aus, habe ich noch nie was mit gemacht. Tut mir leid wenn ich es euch unnötig schwer mache, bin froh das ihr mir helft!
Ok, das mit dem Datum und der Größe habe ich jetzt auch so, nur wie kann ich das jetzt in meine Stringlist schreiben, die ist leider immer noch leer und ich weiß nicht warum. Das Debugen hab ich schon probiert, das hilft mir nicht weiter, scheinbar schreibt er garnichts in List... Wäre super wenn mir da noch jemand helfen könnte, das ist dann denke ich der letzte schritt. Das ist di Funktion:
Delphi-Quellcode:
So versuche ich sie Aufzurufen: (wie gesagt mit einer ListBox funktionierts)
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);
procedure ScanDir(const Directory: string); var Mask : string; var SR : TSearchRec; begin Mask := '*.*'; if FindFirst(Directory+Mask,faAnyFile and not faDirectory, SR) = 0 then begin try repeat List.Add(Directory+SR.Name+'#'+IntToStr(SR.FindData.nFileSizeHigh)+'*' +IntToStr(SR.FindData.ftLastAccessTime.dwLowDateTime)); until FindNext(SR) <> 0; finally FindClose(SR); end; end; if FindFirst(Directory+Mask,faAnyFile,SR) = 0 then begin try repeat if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then begin ScanDir(Directory+SR.Name+'\'); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; begin List.BeginUpdate; try if ClearList then begin List.Clear; end; if Directory = '' then begin Exit; end; if Directory[Length(Directory)] <> '\' then begin Directory := Directory+'\'; end; Directory := Directory+'\'; ScanDir(Directory); finally List.EndUpdate; end; end;
Delphi-Quellcode:
Wie gesagt die Liste bleibt leer, egal was ich auch schon probiert hab.
var List : TStringList;
List := TStringList.Create; TDataWork.GetAllFilesInDirectorys(Pfad,List,true); Gruß AnyKey |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Hallo,
Zitat:
Delphi-Quellcode:
Oder was meintest du ?
var
List: TStringList; begin List:= TStringList.Create; try TDataWork.GetAllFilesInDirectorys(Pfad,List,true); finally List.Free; end; end; Heiko |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ja das meinte ich, aber in meiner Liste steht nichts drin :(
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Du musst die Liste auch erst einmal erzeugen (siehe Heikos Code).
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Habe ich, hab ich oben ergänzt, hatte ich nur vergessen zu posten :P
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Und wo wird "Pfad" gesetzt?
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Pfad kommt aus einer Datenbank, der Pfad steht danach auch in der Variabel drin...
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Dann ändere mal den "Hauptteil" der Methode.
Delphi-Quellcode:
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; |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Versuch es mal mit:
Delphi-Quellcode:
Gruß
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string;var List: TStrings; ClearList: Boolean);
K-H |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Wozu das? Objektinstanzen werden im Normalfall nicht als var übergeben.
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Hallo,
ist ja hier egal ;) Aber das hier könnte ein Problem sein.
Delphi-Quellcode:
Ist Directory z.B. c:\temp kommt
Mask := '*.*';
if FindFirst(Directory+Mask c:\temp*.* raus. Es würde der Backslash fehlen if FindFirst(Directory+'\'+Mask[/delphi] Wenn es das ist, du hast 2 Stellen davon im Code. Das bekommt man aber per F5, F7, F8 leicht raus ... Heiko |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Siehe #25 ;)
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Hallo,
ui, da war jemand schneller und ich habs überlesen ;) Heiko |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Danke für die vielen Antworten :) ich habe das von DeddyH mal kopiert und bei mir eingefügt, die Liste bleibt allerdings immer noch leer
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Dann zeig doch nochmal den aktuellen Code (Methode und Aufruf komplett).
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
@hoika
das seltsame
Delphi-Quellcode:
ist ja immer noch da, der fehlende Backslash könnte es also nicht sein.
if Directory[Length(Directory)] <> '\' then
begin Directory := Directory+'\'; end; Directory := Directory+'\'; ScanDir(Directory); Gruß K-H |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Die Procedure:
Delphi-Quellcode:
und der Aufruf:
class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);
procedure ScanDir(const Directory: string); var Mask : string; var SR : TSearchRec; begin Mask := '*.*'; if FindFirst(Directory+Mask,faAnyFile and not faDirectory, SR) = 0 then begin try repeat List.Add(Directory+SR.Name+'#'+IntToStr(SR.FindData.nFileSizeHigh)+'*' +IntToStr(SR.FindData.ftLastAccessTime.dwLowDateTime)); until FindNext(SR) <> 0; finally FindClose(SR); end; end; if FindFirst(Directory+Mask,faAnyFile,SR) = 0 then begin try repeat if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then begin ScanDir(Directory+SR.Name+'\'); 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;
Delphi-Quellcode:
Hoffe das hilft euch weiter, wie gesagt ich habe das Gefüht das er die Liste garnicht füllt in der Procedure, zumindest wird das durch debugen nicht deutlich. Wenn ich die Procedure allerdings aufrufe und eine ListBox übergebe funktioniert das ganze einwandfrei...
var List : TStringList;
List := TStringList.Create; // Pfad kommt aus einer Datenbank Inhalt: 'C:\Dokumente und Einstellungen\Beispiel' TDataWork.GetAllFilesInDirectorys(Pfad,List,true); |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Bist Du mal mit F7 durchgesteppt? Werden dabei Zeilen übersprungen?
[edit] Jetzt bin ich neugierig geworden und hab das selbst ausprobiert (ein Button und ein Memo auf der Form):
Delphi-Quellcode:
Funktioniert einwandfrei, das Memo wird befüllt. [/edit]
procedure TForm1.Button1Click(Sender: TObject);
var List: TStringlist; begin List := TStringlist.Create; try TDataWork.GetAllFilesInDirectorys('C:\Test',List,true); Memo1.Lines.Assign(List); finally List.Free; end; end; |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
nein bin mit F8 durchgegangen, und ja er überspringt scheinbar immer die stelle an der eigentlich in die Liste geschrieben werden soll, das interessante ist aber dieser Aufruf funktioniert:
Delphi-Quellcode:
hier bekommt man alles in der ListBox angezeigt. Ich blick nich mehr durch und es müsste so langsam mal funktionieren... :(
TDataWork.GetAllFilesInDirectorys(Edit1.Text,Listbox1.Items,True);
Edit: Sag ich ja, ListBox funktioniert auch, nur die Stringlist nicht :( ich brauch aber keine Anzeige sondern nur die Liste... |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ich verwende da ja auch nur eine Stringliste, lasse diese befüllen und gebe sie dann im Memo aus. Klappt also, das muss irgendetwas anderes sein.
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
hm... kannst du vielleicht mal deinen code posten, dann vergleich ich das noch mal mit meinem, vielleicht hab ich ja noch woanders einen fehler gemacht den ich übersehen habe...
|
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Auch wenn das dann zum x-ten Mal hier steht, mein kompletter implementation-Abschnitt:
Delphi-Quellcode:
implementation
{$R *.dfm} type TDataWork = class public class procedure GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean);static; end; class procedure TDataWork.GetAllFilesInDirectorys(Directory: string; List: TStrings; ClearList: Boolean); procedure ScanDir(const Directory: string); var Mask : string; SR : TSearchRec; begin Mask := '*.*'; if FindFirst(Directory+Mask,faAnyFile and not faDirectory, SR) = 0 then begin try repeat List.Add(Directory+SR.Name+'#'+IntToStr(SR.FindData.nFileSizeHigh)+'*' +IntToStr(SR.FindData.ftLastAccessTime.dwLowDateTime)); until FindNext(SR) <> 0; finally FindClose(SR); end; end; if FindFirst(Directory+Mask,faAnyFile,SR) = 0 then begin try repeat if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then begin ScanDir(Directory+SR.Name+'\'); 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; procedure TForm1.Button1Click(Sender: TObject); var List: TStringlist; begin List := TStringlist.Create; try TDataWork.GetAllFilesInDirectorys('C:\Test',List,true); Memo1.Lines.Assign(List); finally List.Free; end; end; |
Re: Rekursives durchsuchen und Letzten Dateizugriff auslesen
Ich verstehs einfach nich, wenn ich mir List.Count ausgeben lass steht da 0 drin. Das kann doch nich daran liegen das die Procedure in einer Klasse ist und ich sie von außen aufrufe....... ich weiß nich mehr weiter...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz