AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FileExists/FileDate - Auslesen über Netzwerk langsam
Thema durchsuchen
Ansicht
Themen-Optionen

FileExists/FileDate - Auslesen über Netzwerk langsam

Ein Thema von dGeek · begonnen am 10. Sep 2016 · letzter Beitrag vom 12. Sep 2016
 
dGeek
(Gast)

n/a Beiträge
 
#26

AW: FileExists/FileDate - Auslesen über Netzwerk langsam

  Alt 11. Sep 2016, 22:23
Beides NTFS.

Zur StringList. Ja ich weiß, nicht gut.
Aber auf diese Art und Weise kann ich die Funktion ( GetFilesInDirectory ) mit und ohne Record benutzen:
procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, AsObjectList, ClearList: Boolean); Ich weiß. Der Variablenname ist total missverständlich aber so funktioniert es:

Delphi-Quellcode:
type
 PFileListEntry = ^TFileListEntry;

 TFileListEntry = packed record
  sFileName: string;
  iFileSize: Int64;
  iFileDate: Extended;
 end;

procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, AsObjectList, ClearList: Boolean);
var
 aFileListEntry: PFileListEntry;

  procedure ScanDir(const Directory: string);
  var
   SR: TSearchRec;
  begin
   if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then
    try
     repeat
      Application.ProcessMessages;

      /// //////////////////////////////////////////////////////////////////////////////////
      if AsObjectList then
       begin
        System.New(aFileListEntry);
        aFileListEntry.sFileName := SR.Name;
        aFileListEntry.iFileSize := SR.Size;
        aFileListEntry.iFileDate := SR.TimeStamp;
        List.AddObject('F_' + SR.Name, Pointer(aFileListEntry));
       end
      else
       begin
        List.Add(SR.Name);
       end;
      /// //////////////////////////////////////////////////////////////////////////////////

     until FindNext(SR) <> 0;
    finally
     FindClose(SR);
    end;

   if WithSubDirs then
    begin
     if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then
      try
       repeat
        Application.ProcessMessages;

        if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then
         ScanDir(Directory + SR.Name + '');
       until FindNext(SR) <> 0;
      finally
       FindClose(SR);
      end;
    end;
  end;

begin
  List.BeginUpdate;
  
  try
   if ClearList then
    List.Clear;
  
  if Directory = '\then
    Exit;

    if Directory[Length(Directory)] <> '\then
    Directory := Directory + '\';

    ScanDir(Directory);
  finally
   List.EndUpdate;
  end;
end;

function IndexOfListObjects(const s: string; List: TStringList): Integer;
begin
 for Result := 0 to List.Count - 1 do
  if s = PFileListEntry(List.Objects[Result])^.sFileName then
   Exit;

 Result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 freq: Int64;
 startTime: Int64;
 endTime: Int64;

 i, iDestFileIndex: Integer;
 sSourceDir, sDestDir: String;
 slSource, slDest: TStringList;

 aFileListEntrySource, aFileListEntryDest: TFileListEntry;
begin
 QueryPerformanceFrequency(freq);
 QueryPerformanceCounter(startTime);

 slSource := TStringList.Create;
 slDest := TStringList.Create;

 try
  sSourceDir := 'D:\Test1\'; // behinhaltet 10.000 Dateien
  sDestDir := 'D:\Test2\'; // behinhaltet ebenfalls 10.000 Dateien, welche identisch sind

  GetFilesInDirectory(sSourceDir, '*.*', slSource, True, True, False);
  GetFilesInDirectory(sDestDir, '*.*', slDest, True, True, False);

  for i := 0 to slSource.Count - 1 do
   begin
    Application.ProcessMessages;

    aFileListEntrySource := PFileListEntry(slSource.Objects[i])^;

    iDestFileIndex := IndexOfListObjects(aFileListEntrySource.sFileName, slDest);
    if iDestFileIndex > -1 then
     begin
      aFileListEntryDest := PFileListEntry(slDest.Objects[iDestFileIndex])^;

      if aFileListEntrySource.iFileDate > aFileListEntryDest.iFileDate then
       begin
        // Tue was auch immer mit aFileListEntrySource
       end;
     end;
   end; // for
 finally
  for i := 0 to slSource.Count - 1 do
   Dispose(PFileListEntry(slSource.Objects[i]));

  for i := 0 to slDest.Count - 1 do
   Dispose(PFileListEntry(slDest.Objects[i]));

  slSource.Free;
  slDest.Free;
 end;

 QueryPerformanceCounter(endTime);
 showmessage('Die Routine benötigte etwa ' + IntToStr((endTime - startTime) * 1000 div freq) + 'ms');
end;
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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