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 Verzeichnisse kopieren mit ShFileOperation erzeugt Fehler (https://www.delphipraxis.net/116995-verzeichnisse-kopieren-mit-shfileoperation-erzeugt-fehler.html)

matashen 9. Jul 2008 20:14


Verzeichnisse kopieren mit ShFileOperation erzeugt Fehler
 
Hallo zusammen,

ich bin jetzt schon seit 2 Stunden in Hilfen und Foren am lesen und suchen, warum ich nix kopieren kann.

Ich hatte folgende Routine schonmal erfolgreich verwendet um Verzeichnisse zu kopieren

Delphi-Quellcode:
function CopyDir(const fromDir, toDir: widestring): Boolean;
// ^^^ von String nach widestring nach Problemen mit langen Dateinamen ^^^
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom := PChar(fromDir + #0);
    pTo   := PChar(toDir)
  end;
  Result := (0 = ShFileOperation(fos));
end;
So hab ich diesen Code genommen und in mein neues Projekt kopiert.
leider funzt das gar nicht. Weder eine Datei zu kopieren noch ein ganzes Verzeichnis.
der letzte verzweifelt aufruf war
Delphi-Quellcode:
copydir('D:\Memotest.bmp','XXXMEO.BMP')
Als Antwort vom System bekomme icheine Warnmeldung mit der Schrift
Datei kann nicht kopiert werden:Die Quelldatei oder vom Datenträger kann nicht kopiert werden

weis da jemand rat woher dieser Fehler kommt ?

Gruß Matthias

Christian Seehase 9. Jul 2008 20:29

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
Moin Matthias,

hier:
Delphi-Quellcode:
pTo   := PChar(toDir)
fehlt noch das +#00

Ob WideString oder String hat übrigens nichts mit langen Dateinamen zu tun.
Solange Du die Standardversion der API-Funktion benutzt, ist es sowieso die für Ansi, und nicht für Wide.

marabu 9. Jul 2008 20:35

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
Hallo Matthias,

hast du es schon so probiert?

Delphi-Quellcode:
function CopyDir(const fromDir, toDir: string): Boolean;
// für Widestring-Namen ist ShFileOperationW() zu verwenden
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom := PChar(fromDir + #0);
    pTo   := PChar(toDir);
  end;
  Result := (0 = ShFileOperation(fos));
end;
Aufruf so:
Delphi-Quellcode:
copydir('D:\Memotest.bmp', 'D:\XXXMEO.BMP');
// MS: Use fully-qualified paths.
// Using relative paths is not prohibited, but can have unpredictable results.
@Christian:
WinSDK :: SHFILEOPSTRUCT
  • For Copy and Move operations, the buffer can contain multiple destination file names if the fFlags member specifies FOF_MULTIDESTFILES.
  • Pack multiple names into the pTo string in the same way as for pFrom.

Ohne das Flag wird der Leerstring wohl nicht benötigt.

Freundliche Grüße

matashen 9. Jul 2008 20:41

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
@Christian:
das ergänzen des Codes brachte leider das gleiche ergebnis => funzt nicht

Das mit widestring hat tatsächlich mein Problem gelöst, ist noch aus meinem älteren Projekt warum ich nicht genau darauf eingehen möchte.

Aber wie gesagt es funzt so nicht.

ob ich das #00 anhänge scheint auch egal zu sein...


@marabu: Du hast nur bei Quelle nen Leerstring angehängt, das reicht?

Kann sonst keinen Unterschied entdecken ???

Gruß Matthias

Christian Seehase 9. Jul 2008 20:43

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
Moin Marabu,

ein Stück weiter oben steht dann noch:

Zitat:

Like pFrom, the pTo member is also a double-null terminated string and is handled in much the same way.
;-)

matashen 9. Jul 2008 20:46

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
Man sollte einfach mit klarem Kopf so nen Code verbrechen - wie konnt ich das übersehen - hab die Zeilen heute xmal gelesen :wall: :wall:


Danke an euch...es funzt jetzt

Gruß Matthias

marabu 9. Jul 2008 21:02

Re: Verzeichnisse kopieren mit ShFileOperation erzeugt Fehle
 
Moin Christian,

Zitat:

Zitat von Christian Seehase
... ein Stück weiter oben steht dann noch ...

du interpretierst das falsch - pTo wird nur als String-Array betrachtet, wenn das besagte Flag gesetzt ist.

Ein, zwei zusätzliche Nulls am Ende schaden allerdings auch nicht.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 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