Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dateioperationen, schneller als mit SHFileOperation? (https://www.delphipraxis.net/147486-dateioperationen-schneller-als-mit-shfileoperation.html)

alzaimar 9. Feb 2010 21:04


Dateioperationen, schneller als mit SHFileOperation?
 
Ich möchte folgende Operation mit so wenig wie möglich Netzwerklast implementieren:
Code:
  If File is Directory then
    CopyAllFiles(File, TargetDirectory)
  else
   CopyOneFile (File, TargetDirectory)
Mein bisheriger Ansatz: CopyFile aufrufen (ich versuch's einfach mal). Wenn es nicht funktioniert und GetLastError=5 (Access denied) ist, könnte es ein Verzeichnis sein. Dann versuche ich mein Glück einfach.

Ich erspare mir also, jedesmal erst zu prüfen, ob es sich bei 'Filename' um ein Verzeichnis handelt.

Delphi-Quellcode:
procedure TFileOperation.CopyFileOrDirectory (filename, destination : String);
  Procedure _CheckResult(aOpResult : Boolean);
  Begin
    if not aOpResult then
      if GetLastError()=5 then
        raise EAccessDeniedException.Create('');
  End;

begin
  Try
    _CheckResult(CopyFile(PChar (filename), PChar (destination ), False));
  Except
    On E:EAccessDeniedException Do
      CopyDirectory (filename, destination);
  end;
end;
Geht das noch resourcenschonender oder ruft CopyFile eh intern irgendwo vermutlich 'IsDirectory' auf?

Astat 9. Feb 2010 21:31

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Hallo alzaimar, mir ist noch nicht ganz klar wie du zu der Liste der zu kopierenden Files kommst.
Irgendwie musst Du ja die Liste erstellen (suchen ab einem bestimmten Verzeichnis?? etc.),
und da könnte man doch unterscheiden ob Directory or not?
FindFirstFile --> FindNextFile --> if Filename = . or = .. dann Directory?

Sehe ich das richtig, dass du von einem Netzlaufwerk zu einem Anderen, über SMB, diverse File-Strukturen kopieren willst?

lg. Astat

alzaimar 9. Feb 2010 21:42

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Hi Astat,
... stimmt, ich bin ja auch ein Depp.

Deine Nachfragen beinhalten die Lösung.

Ich erstelle mit FindFirst/FindNext ein Verzeichnis, aus dem ich die zu kopierenden Dateien auswähle.. Die packe ich Depp in eine Stringliste und baue mir eine separate Methode, die alle Dateien dieser Stringlist kopiert, und wenns ein Verzeichnis ist, dann..

Ich weiss doch aber beim Erstellen der TStringlist, worum es sich handelt.

Aua, tut das weh :wall:

himitsu 9. Feb 2010 23:51

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Zitat:

Delphi-Quellcode:
Try
  _CheckResult(CopyFile(PChar (filename), PChar (destination ), False));
Except
  On E:EAccessDeniedException Do
    CopyDirectory (filename, destination);
end;

Wenn z.B. das Kopieren einer Datei Aufgrund verbotener Rechte schief geht,
dann kann/wird CopyDirectory auch schiefgehn ... und es wird keine Fehlermeldung ausgelöst.

PS: das Try-Except ist ja wohl nur da, um die im "Fehlerfall" absichtlich ausgelöste Exception abzufangen und das ist eine Mißhandlung dieser "Ausnahmebehandlung".

Da du die Rückgabewerte eh nicht genau auswärtest, hätte dieses vollkommen ausgereicht.
Delphi-Quellcode:
procedure TFileOperation.CopyFileOrDirectory (filename, destination : String);
begin
  CopyFile(PChar (filename), PChar (destination), False))
    or CopyDirectory(filename, destination);
end;

alzaimar 10. Feb 2010 04:43

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Zitat:

Zitat von himitsu
Zitat:

...das Try-Except ist ja wohl nur da, um die im "Fehlerfall" absichtlich ausgelöste Exception abzufangen und das ist eine Mißhandlung dieser "Ausnahmebehandlung".
Sie kann sich ja beschweren. Die Frage lautet ja: Wie bekomme ich das am schnellsten hin (muss über eine VPN-Verbindung Dateien und Verzeichnisse kopieren)

Zitat:

Zitat von himitsu
Da du die Rückgabewerte eh nicht genau auswertest, hätte dieses vollkommen ausgereicht.

:oops:
Delphi-Quellcode:
procedure TFileOperation.CopyFileOrDirectory (filename, destination : String);
begin
  CopyFile(PChar (filename), PChar (destination), False))
    or CopyDirectory(filename, destination);
end;

Wo finde ich dieses 'CopyDirectory'?

Tom 10. Feb 2010 05:07

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Zitat:

Zitat von alzaimar
Wo finde ich dieses 'CopyDirectory'?

Bei Dir ... :wink:
Zitat:

Zitat von alzaimar
Delphi-Quellcode:
  Try
    _CheckResult(CopyFile(PChar (filename), PChar (destination ), False));
  Except
    On E:EAccessDeniedException Do
      CopyDirectory (filename, destination);
  end;
end;


alzaimar 10. Feb 2010 05:39

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Wieso bin ich in letzter Zeit so mental inkompentent? :wall:

himitsu 10. Feb 2010 05:51

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Zitat:

Zitat von alzaimar
Wieso bin ich in letzter Zeit so mental inkompentent? :wall:

wir werden langsam alt http://www.greensmilies.com/smile/sm...ticons_opa.gif, mach dir nichts draus

DeddyH 10. Feb 2010 08:24

Re: Dateioperationen, schneller als mit SHFileOperation?
 
Es tut gut, festzustellen, dass es nicht nur mir... was wollte ich nochmal sagen? Hallo Fräulein? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

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