AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi FileCopy-Funktion optimieren (Buffer-Size)

FileCopy-Funktion optimieren (Buffer-Size)

Ein Thema von Normalement · begonnen am 26. Mär 2016 · letzter Beitrag vom 30. Mär 2016
Antwort Antwort
Normalement
(Gast)

n/a Beiträge
 
#1

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 26. Mär 2016, 19:54
Danke für eure Antworten!
Leider wäre es jetzt eine Qual, von meiner Funktion in eine Stream-Funktion umzuschreiben.

Eine Idee, welche bisher nur im Kopf existiert wäre ungefähr so:

Delphi-Quellcode:
const
 {$IFDEF WIN32}
   BufSize = 4 * 4096;
 {$ELSE}
   BufSize = 8 * 4096;
 {$ENDIF}
Wäre das eine Idee?

Ansonsten würde ich zusätzlich noch alle Dateien zählen und die Durchschnittsgröße berechnen und anhand dessen entschieden.
Schlimmsten Falls könnte ich noch eine Fallunterscheidung machen (<= 4GB RAM etc.)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 26. Mär 2016, 20:15
Im Prinzip musst du nur deinen Code durch meinen ersetzen (ein paar Zeilen kannst du von dir behalten) und fertig. Was ist daran schwierig oder eine Qual?

Wenn du die Buffer-Größe selber verwalten möchtest, kopierst du dir den Code von TStream.CopyFrom und änderst die Buffer-Größe.

Eine Abhängigkeit vom der Bittigkeit des Betriebssystems macht keinen Sinn, denn die Clustergröße ist davon nicht abhängig.

Wenn du parallel Dateien kopieren willst (Stichwort Threads) dann solltest du dir einen Datei-Kopier-Service schreiben der die Regie übernimmt. Dort wird dann in Abhängigkeit von der Bittigkeit des Betriebssystems und der Art der Festplatte und den jeweiligen Zielen (physikalische Platten) mehr oder weniger gleichzeitig die Vorgänge abgearbeitet.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Normalement
(Gast)

n/a Beiträge
 
#3

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 26. Mär 2016, 20:17
Meine Funktion oben ist sehr beschnitten. Diese benutze ich bereits in Threads mit Callbacks und vielem mehr.
Funktioniert auch richtig gut. Ich dachte nur, man könnte es optimieren ohne alles neu schreiben zu müssen.

Hier gibt es zwar ein gutes Beispiel, wie man einen Callback mit TStream umsetzt, aber ich warte erst einmal damit, da ich doch sehr viel umändern müsste:
http://stackoverflow.com/questions/6...ess-copyfileex

Geändert von Normalement (26. Mär 2016 um 21:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 27. Mär 2016, 22:41
Fast...

Da DU nur in den WindowsFileCache schreibst, spielt hier auch noch der WindowsFileCache eine Rolle.

Wenn die Dateien (Beide, also Ziel und Quelle) in den RAM passen, dann geht es schnell, aber ist noch lange nicht "geschrieben", was du dann merkst, wenn du große und/oder viele Dateien kopierst.


Ganz im Ernst, lass es und überlass Windows das Kopieren,
die haben sogar eine/mehrere API dafür, man mag es kaum glauben.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 27. Mär 2016, 23:03
Ergo nutz die API von Windows. Aaaaah. Ich merke gerade, dass ich sehr raus bin aus der Programnmierung. Es gibt eine API, die dir sogar den Fortschrittsdialog abnimmt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#6

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 28. Mär 2016, 10:28
Ergo nutz die API von Windows. Aaaaah. Ich merke gerade, dass ich sehr raus bin aus der Programnmierung. Es gibt eine API, die dir sogar den Fortschrittsdialog abnimmt.
Jupp, Eine, die den Standard-Explorer-Dialog anzeigt,
und eine Andere mit einem Callback.

http://windows.microsoft.com/de-de/w...d-paste-a-file


MSDN-Library durchsuchenCopyFile /Delphi-Referenz durchsuchen TFile.Copy
MSDN-Library durchsuchenCopyFile2
MSDN-Library durchsuchenCopyFileEx
MSDN-Library durchsuchenCopyFileTransacted
MSDN-Library durchsuchenShFileOperation
...
Hier im Forum suchenDatei kopieren
http://www.delphipraxis.net/1260-dat...operation.html
http://www.delphipraxis.net/43055-wr...operation.html
http://www.delphi-treff.de/tipps-tri...eien-kopieren/

Unbenannt.png 2. und vor C++
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mär 2016 um 10:40 Uhr)
  Mit Zitat antworten Zitat
Normalement
(Gast)

n/a Beiträge
 
#7

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 28. Mär 2016, 11:43
Ergo nutz die API von Windows. Aaaaah. Ich merke gerade, dass ich sehr raus bin aus der Programnmierung. Es gibt eine API, die dir sogar den Fortschrittsdialog abnimmt.
Das weiß ich natürlich Aber ich brauchte für ein Projekt einen eigenen Fortschrittsdialog. Sagen wir mal, einen etwas sprachfreudigeren und das überall gleich egal ob Windows 7, 8 oder 10 =)

Er funktioniert vollkommen einwandfrei und es gibt absolut keine Probleme. Ich dachte nur ich frage hier mal nach, ob man am Buffer schrauben könnte.
Frage hat sich aber schon seit den ersten beiden Beiträgen (Luckie und Sir Rufo) erledigt.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: FileCopy-Funktion optimieren (Buffer-Size)

  Alt 29. Mär 2016, 08:14
Aber ich brauchte für ein Projekt einen eigenen Fortschrittsdialog. Sagen wir mal, einen etwas sprachfreudigeren und das überall gleich egal ob Windows 7, 8 oder 10 =)
Das kannst du mit CopyFileEx auch haben.
Wenn du trotzdem deinen Uraltcode weiterbenutzen willst probier halt bisschen am Buffer rum und guck was dabei raus kommt.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:40 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