Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FileExists/FileDate - Auslesen über Netzwerk langsam (https://www.delphipraxis.net/190199-fileexists-filedate-auslesen-ueber-netzwerk-langsam.html)

Luckie 11. Sep 2016 12:50

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
1. Daten sammeln (Dateien einmal scannen und die Daten in eine Liste ablegen)
2. Gesammelten Daten vergleichen und zu kopierende Dateien in einer Liste ablegen
3. Dateien nach der Liste kopieren

Was du machst:
1. Einzelne Datei scannen
2. Vergleichen
3. Kopieren
Es muss also für jede einzelne Datei alles immer wieder neu initialisiert werden.

dGeek 11. Sep 2016 15:53

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Zitat:

Zitat von Luckie (Beitrag 1347394)
1. Daten sammeln (Dateien einmal scannen und die Daten in eine Liste ablegen)
2. Gesammelten Daten vergleichen und zu kopierende Dateien in einer Liste ablegen
3. Dateien nach der Liste kopieren

Was du machst:
1. Einzelne Datei scannen
2. Vergleichen
3. Kopieren
Es muss also für jede einzelne Datei alles immer wieder neu initialisiert werden.


Ich sammle erst alle Daten (Quelle) und speichere sie in einer Liste (das geht schnell). Danach gehe ich die Liste durch und prüfe
- gibt es Quell-Datei1 auch im Zielverzeichnis.
https://www.delphi-treff.de/tipps-tr...ateien-suchen/

Daraus baue ich eine neue Liste und die wird später abgearbeitet (Daten werden kopiert).
Anders wüsste ich nicht, wie man Daten vergleichen soll.

zeras 11. Sep 2016 16:03

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Zitat:

Zitat von dGeek (Beitrag 1347401)

Ich sammle erst alle Daten (Quelle) und speichere sie in einer Liste (das geht schnell).

Mache doch das gleiche mit deinem Zielsystem. Wie lange dauert denn das?

Sammle die vorhandenen Infos aus dem Ziel und vergleiche diese mit dem Quellsystem. Bei Differenzen musst du dann reagieren und gegebenenfalls kopieren.

dGeek 11. Sep 2016 16:06

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Guck mal mein Beispiel. Nicht das Sammeln der Daten ist das Problem :)

Kleines Beispiel. Es wurde alles weggelassen bis auf das, wo es hapert.
Das hier braucht rund 23 Sekunden (D:\ = im PC, Y:\ = Festplatte am Router per USB 100 MBit): (keine der Dateien existiert)
Delphi-Quellcode:
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
 ModifiedTime: TFileTime;
 SystemTime: TSystemTime;
begin
 Result := 0;
 if (FileTime.dwLowDateTime = 0) and (FileTime.dwHighDateTime = 0) then
  Exit;

 FileTimeToLocalFileTime(FileTime, ModifiedTime);
 FileTimeToSystemTime(ModifiedTime, SystemTime);
 Result := SystemTimeToDateTime(SystemTime);
end;

function getFileLastModified(const aFileName: string): TDateTime;
begin
 Result := FileTimeToDateTime(JclFileUtils.GetFileLastWrite(aFileName));
end;

function IsFileANewerFileB(aFileA, aFileB: string): Boolean;
var
 bRes: Boolean;
begin
 if (not FileExists(aFileB)) or (not FileExists(aFileA)) then
  bRes := True
 else
  bRes := getFileLastModified(aFileA) > getFileLastModified(aFileB);

 Result := bRes;
end;

/////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
 freq: Int64;
 startTime: Int64;
 endTime: Int64;
 i: Integer;
 a, b: String;
begin
 QueryPerformanceFrequency(freq);
 QueryPerformanceCounter(startTime);

 a := 'D:\Datei1.txt';
 b := 'Y:\Datei2.txt';

 for i := 0 to 9999 do
  begin
   if IsFileANewerFileB(a, b) then
    begin
    end;
  end;

 QueryPerformanceCounter(endTime);

 ShowMessage('Die Routine benötigte etwa ' + IntToStr((endTime - startTime) * 1000 div freq) + 'ms');
end;
/////////////////////////////////////////////////////////////////////////////////
Wenn Y:\ durch D:\ ausgetauscht wird, dauert das Ganze 50ms.

zeras 11. Sep 2016 16:39

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Du solltest einen kompletten Scan auf dem Quellsystem (FindFirst, FindNext, FindClose) machen und das gleiche auf dem Zielsystem. Dann hast du 2 Listen, die du vergleichen kannst. Dann musst du entscheiden, was gemacht werden soll.
Im Moment machst du das mit jeder Datei einzeln,
FileExists, FileTimeToDateTime etc. Das wird dir wohl die Zeit kosten.


Nimm doch einmal
FindFirst, FindNext, FindClose und prüfe deine Zeit lokal und im Netz. Das andere ist nur Rechnerei auf deinem PC, was nicht die Welt an Zeit kosten wird.

dGeek 11. Sep 2016 16:46

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Ich verstehe diesen Ansatz nicht so ganz.

Wenn ich das so mache wie du sagst, dann muss ich die Dateien ja trotzdem gegenprüfen und gucken, ob DateiX im Zielverzeichnis existiert usw.

zeras 11. Sep 2016 17:04

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Zitat:

Zitat von dGeek (Beitrag 1347407)
Ich verstehe diesen Ansatz nicht so ganz.

Wenn ich das so mache wie du sagst, dann muss ich die Dateien ja trotzdem gegenprüfen und gucken, ob DateiX im Zielverzeichnis existiert usw.

Nein, da du ja mit FindFirst, FindNext und FindClose schon weißt, ob die Datei da ist.

Wie gesagt, Quelle scannen in eine Liste, Ziel scannen in eine weitere Liste und die Listen dann gegeneinander abgleichen.
Dann hast du nur 1x einen scan in der Quelle und ein scan im Ziel.

Hier ein Beispiel mit Suche von Verzeichnissen. In der StringList (SL) stehen dann erst einmal die Dateinamen. Gegebenenfalls noch das Datum mit dranhängen oder anderweitig speichern.
Das machst du in der Quelle und im Ziel.

Delphi-Quellcode:
            if SysUtils.FindFirst(Dir + '*.*', SysUtils.faDirectory, SR2) = 0 then
              repeat
                if ((SR2.attr and faDirectory) = faDirectory)
                then

                SL.Add();
              until SysUtils.FindNext(SR2) <> 0;
            finally
              FindClose(SR2);
            end;

dGeek 11. Sep 2016 17:20

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Jetzt hab ich es endlich kapiert :wall:
Also von der Logik her ungefähr so?

- erstelle Liste "Quelle"
- erstelle Liste "Ziel"

- iteriere durch Liste "Quelle"
-- prüfe, z.B. mit IndexOf (StringList), ob Eintrag N der Liste "Quelle" in Liste "Ziel" ist
--- wenn ja > weitere Prüfungen (Datumsvergleich)

Bitte sag mir, dass ich es kapiert habe :stupid:

zeras 11. Sep 2016 17:25

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Zitat:

Zitat von dGeek (Beitrag 1347410)
Jetzt hab ich es endlich kapiert :wall:
Also von der Logik her ungefähr so?

- erstelle Liste "Quelle"
- erstelle Liste "Ziel"

- iteriere durch Liste "Quelle"
-- prüfe, z.B. mit IndexOf (StringList), ob Eintrag N der Liste "Quelle" in Liste "Ziel" ist
--- wenn ja > weitere Prüfungen (Datumsvergleich)

Bitte sag mir, dass ich es kapiert habe :stupid:

Ja so sollte es klappen. Am besten, man merkt sich beim Scannen gleich noch das Datum der letzten Änderung. Ansonsten musst du dann nochmal scannen wegen des Datums. Aber mach doch mal einen Test und gib die Scanzeiten von Quelle und Ziel durch.

Luckie 11. Sep 2016 17:56

AW: FileExists/FileDate - Auslesen über Netzwerk langsam
 
Die Listen enthalten natürlich die erforderlichen Daten zum Vergleichen. Entweder ein Array mit Records oder besser eine Objektliste.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.
Seite 3 von 4     123 4      

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