Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Dateien performant mit Callback kopieren (https://www.delphipraxis.net/197377-dateien-performant-mit-callback-kopieren.html)

DieDolly 2. Aug 2018 16:44

Dateien performant mit Callback kopieren
 
Mit welcher Technik ließt und schreibt man am schnellsten / besten Daten von und auf eine Festplatte, sodass ich in einer Callbackprozedur zeitgleich Daten wie bereits kopierte Bytes, Dateigröße und Dateiname abfragen kann?

Ich bin über jegliche Hilfe dankbar.

KodeZwerg 2. Aug 2018 17:12

AW: Dateien performant mit Callback kopieren
 
Je nachdem um was für Inhalt es sich handelt gäbe es verschiedene Lösungen.

Geht es nur darum Datei A nach Datei B zu kopieren, Api oder TFileStreams.
Über Api kann ein Windows-Kopieren Dialog eingeblendet werden.
Über TFileStream liegt alles bei Dir. Damit habe ich gute Erfahrungen sammeln können bei ca 64kb chunks.
Benötigt man auch noch spezielle Attribute, oder Dateiberechtigungen, ist erheblich mehr Aufwand nötig.

DieDolly 2. Aug 2018 17:22

AW: Dateien performant mit Callback kopieren
 
Es geht nur um Datei von A nach B.
Jedoch komplett ohne Windows-Dialoge. Nur Eigenbau.

KodeZwerg 2. Aug 2018 17:33

AW: Dateien performant mit Callback kopieren
 
Ein Möglicher Ansatz, nur hier im Editor erstellt als Vorwarnung....
Delphi-Quellcode:
Procedure DollyCopy(const SourceFilename, TargetFilename: string);
var
  Source, Target: TFileStream;
Begin
  Source := TFileStream.Create(SourceFilename, fmOpenRead);
  Try
    Target := TFileStream.Create(TargetFilename, fmOpenWrite OR fmCreate);
    Try
      Target.CopyFrom(Source, Source.Size);
    Finally
      Target.Free;
    End;
  Finally
   Source.Free;
  End;
End;
Noch wird nichts geprüft, noch wird alles in einem Rutsch erledigt, das soll lediglich die Basics verdeutlichen.
Es gibt auch zig andere Möglichkeiten.... so in etwa sieht meine auch aus, nur das ich nicht alles auf einmal lese/schreibe.

JanWe 2. Aug 2018 17:34

AW: Dateien performant mit Callback kopieren
 
also ich hab das immer so gemacht:
Delphi-Quellcode:
Datei1Str := 'C:\Datei.txt';
Datei2Str := 'D:\Datei.txt';

if FielExists(Datei) then
ErfolgBool := CopyFile (pchar(Datei1Str),pchar(Datei2Str), TRUE );
// wenn bei Parameter 3 True gesetzt ist, wird abgebrochen, falls die Datei bereits existiert
//bei FALSE wird die Datei gnadenlos überschrieben.

KodeZwerg 2. Aug 2018 17:51

AW: Dateien performant mit Callback kopieren
 
Delphi-PRAXiS hat auch Beispiele wenn man sucht ^_^
Da ist es mit BlockRead/Write realisiert worden.

edit:
Ps: Am performantesten ist es so wenig wie möglich in GUI darzustellen, am schlimmsten wäre zum Beispiel eine ProgressBar die jedes Byte hochzählt.

himitsu 2. Aug 2018 20:52

AW: Dateien performant mit Callback kopieren
 
Ein gibt garnichts, was am Performantesten ist.

* wie viel wird kopiert (Anzahl und Größe)
* von wo nach wo wird kopiert (HDD, SDD, SD, NetShare, ...)
* wie viel RAM ist frei (da alles bissher hier genannte mit FileCache kopiert)
* wie sind die Controller/Treiber von Quelle und Ziel eingestellt (mit oder ohne Cache ... z.B. bei externen Datenträgern für "schnelles" entfernen)
* ...

Je nach Bedinungen ist etwas anderes performanter.
* mit oder ohne Lesecache kopieren (Cache im Controller und RAM) und wenn ja, mit wieviel
* mit Schreibcache kopieren oder ohne FileCache im RAM
* direkt auf die Platte oder nur in Cache (pass through)
* bei Netzwerken kann es eventuell schneller sein, auch noch Multithreaded zu arbeiten, also mehrere Dateien/Dateiteile gleichzeitig übertragen (wenn die Übertragung eines einzelen Kanals limitiert ist)
* ...

p80286 2. Aug 2018 21:41

AW: Dateien performant mit Callback kopieren
 
Was hast Du vor?
Wenn Du selbst kopierst, kennst Du Dateinamen und Dateigröße, also warum abfragen?
Du könntest mit mehreren Threads die Dateien kopieren, aber wenn das auf nur einer Festplatte stattfinden soll, ist das eher kontraproduktiv. Sei's drum, Du kannst jeden Thread eine Message mit dem aktuellen Stand des Kopiervorgangs schicken lassen.

Gruß
K-H

KodeZwerg 3. Aug 2018 05:47

AW: Dateien performant mit Callback kopieren
 
Zitat:

Zitat von himitsu (Beitrag 1409572)
Ein gibt garnichts, was am Performantesten ist.

Zumindest nannte ich eine tödlich-performante Variante, jedes Byte in GUI darstellen, da verlagert sich dann der Flaschenhals nach GUI.
Zitat:

Zitat von p80286 (Beitrag 1409574)
Sei's drum, Du kannst jeden Thread eine Message mit dem aktuellen Stand des Kopiervorgangs schicken lassen

Solange es Lokal "fest verkabelt" und nicht über LAN (o.ä.) stattfindet, Rate ich davon ab, Flaschenhals ist bei Kopierprozessen idR der BUS.


Meine Erfahrungen mit selbst gezüchteten Kopiertechniken:
  • Eine non-Cached Variante verliert idR bei Performance-Tests immer.
  • Eine multi-Thread Variante scheitert meist am BUS Flaschenhals, da kann man auch die Kerne im Vorfeld auslesen und dementsprechend Threads verteilen, es passt nunmal nur eine Gewisse Menge an Daten zwischen den BUS.
  • eine cached Variante mit 4kb ist sehr flott, bei 64kb blöcken habe ich in meinem System die beste Kopier-Rate.
  • Kopier-Programme die im Vorfeld verbaute Caches ermitteln kenne ich persönlich noch nicht, das wäre mal eine Herausfordernung.
  • Für eine ProgressBar kommt aus meiner Sicht nur eine Prozent-Anzeige in Frage, ich selbst nutze eine 5% Variante, habe noch keine Nachteile feststellen können. (alle +5% aktualisiert sich meine GUI)
  • Ich selbst erstelle/nutze einen Kopier-Thread, damit GUI entlastet wird.

Sinnvolle Anzeigen für GUI:
  • ProgressBars für kompletten Vorgang und aktueller Datei (für Multi-Copy)
  • Labels für alle Bytes, kopierte Bytes; dazu vielleicht noch ein Label mit Rest-Kopier-Dauer?
  • Label für Dateinamen (bei Multi-Copy erscheint bei mir noch ein Label mit Pfad)
  • Abbrechen Knopf

Sinnvolle non-Visual Dinge:
  • Hash/CRC Kontrolle zum verifizieren der Daten.
  • Für cache Varianten könnten hier zusätzliche Manipulatoren eingeplant werden. Komprimierung/Verschlüsselung zum Beispiel. Je nach Sinn und Zweck.

API 3. Aug 2018 08:20

AW: Dateien performant mit Callback kopieren
 
Mit CopyFileEx()?

http://delphidabbler.com/tips/160


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 1 von 4  1 23     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