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/)
-   -   Probleme mit SHFileOperation (https://www.delphipraxis.net/160491-probleme-mit-shfileoperation.html)

rainerg 15. Mai 2011 23:36

Probleme mit SHFileOperation
 
Hallo, mal wieder ein kleines Problem!

Aus diesem Thread --> http://www.delphipraxis.net/50745-xc...nachbauen.html habe ich von MaBuSe folgenden Code entnommen:
Delphi-Quellcode:
uses ShellAPI;

function MyCopy(Quelle, Ziel: string):Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY // nur Dateien wenn Wildcard (*.*) verwendet werden
           or FOF_NOCONFIRMATION; // Keine Abfrage, es wird JA angenommen (z.B. überschreiben)
    pFrom := PChar(Quelle + #0);
    pTo := PChar(Ziel)
  end;
  Result := (0 = ShFileOperation(fos));
end;
Im ersten Durchlauf ist alles bestens:
Delphi-Quellcode:
MyCopy('c:\source_path','c:\dest_path')
erzeugt folgendes:
Code:
c:\dest_path\file1.txt
c:\dest_path\file2.txt
c:\dest_path\file3.txt
Aber beim zweiten Durchlauf sieht die Sache so aus (inkl. der unangetasteten Dateien aus dem ersten Durchgang):

Code:
c:\dest_path\source_path\file1.txt
c:\dest_path\source_path\file2.txt
c:\dest_path\source_path\file3.txt
Die nächsten Runden schreiben wie im zweiten Durchlauf, dort werden also die Dateien überschrieben.

Ich will aber weiterhin kopieren, wie im ersten Durchgang (ohne Rückfrage - einfach blöd und brtual kopieren) ohne den Ordner aus dem Source-Pfad.

Wie kann ich verhindern, dass in den weiteren Durchläufen die Dateien eine Ebene tiefer kopiert werden?

Sir Rufo 15. Mai 2011 23:43

AW: Probleme mit SHFileOperation
 
So vielleicht
Delphi-Quellcode:
MyCopy('c:\source_path\*.*','c:\dest_path')
?

himitsu 15. Mai 2011 23:45

AW: Probleme mit SHFileOperation
 
versuch mal
Delphi-Quellcode:
MyCopy('c:\source_path\*.*', 'c:\dest_path');
oder
MyCopy('c:\source_path\*.*', 'c:\dest_path\');
Delphi-Quellcode:
MyCopy('c:\source_path', 'c:\dest_path');
kopiert eigentlich das Verzeichnis source_path nach dest_path und nicht die Dateien in source_path,
womit ich eigentlich immer das zweite Ergebnis erwartet hätte.

[edit]
och menno :cry:


[add]
Häng bitte an das Ziel auch noch die zweite #0 an >
Delphi-Quellcode:
PChar(Ziel + #0)
.
Das sind beides Listen, also müssen Beide mit #0#0 abgeschlossen werden.

[add]
Delphi-Quellcode:
function MyCopy(Quelle, Ziel: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  Quelle := IncludeTrailingPathDelimiter(Quelle) + '*.*'#0;
  Ziel := IncludeTrailingPathDelimiter(Ziel) + #0; // oder Ziel := ExcludeTrailingPathDelimiter(Ziel) + #0;
  ...
    pFrom := PChar(Quelle);
    pTo := PChar(Ziel);

Sir Rufo 15. Mai 2011 23:50

AW: Probleme mit SHFileOperation
 
Zitat:

Zitat von himitsu (Beitrag 1101009)
womit ich eigentlich immer das zweite Ergebnis erwartet hätte.

[edit]
och menno :cry:

wenn dest_path nicht existiert, dann geht die Funktion davon aus, dass das der neue Name für das Verzeichnis sein soll.
Wenn dest_path existiert, dann wird das als Kopierziel betrachtet und der Ordner wird dorthin kopiert.

himitsu 15. Mai 2011 23:54

AW: Probleme mit SHFileOperation
 
Zitat:

Zitat von Sir Rufo (Beitrag 1101010)
wenn dest_path nicht existiert, dann geht die Funktion davon aus, dass das der neue Name für das Verzeichnis sein soll.
Wenn dest_path existiert, dann wird das als Kopierziel betrachtet und der Ordner wird dorthin kopiert.

Das ist ja blöde und das steht nimma im MSDN drin. :shock:

Was passiert, wenn man dem Ziel einen \ anhängt?

rainerg 16. Mai 2011 00:22

AW: Probleme mit SHFileOperation
 
Zitat:

Zitat von himitsu (Beitrag 1101009)
versuch mal
Delphi-Quellcode:
MyCopy('c:\source_path\*.*', 'c:\dest_path');
oder
MyCopy('c:\source_path\*.*', 'c:\dest_path\');

'Eigentlich' läuft das damit, ABER ...
so werden Unterverzeichnisse nicht mitkopiert und beim ersten Anlegen gibt es eine Rückfrage, ob das Verzechnis angelegt werden soll.

Delphi-Quellcode:
MyCopy('c:\source_path\', 'c:\dest_path');
oder
MyCopy('c:\source_path\', 'c:\dest_path\');
kopiert Unterverzechnisse mit.

:-(

Aber jetzt erstmal:
Delphi-Quellcode:
Repeat
     Sleep;
Until Wecker=bimmelt;

himitsu 16. Mai 2011 06:30

AW: Probleme mit SHFileOperation
 
Zitat:

Zitat von rainerg (Beitrag 1101012)
'Eigentlich' läuft das damit, ABER ...
so werden Unterverzeichnisse nicht mitkopiert

Aber genau das willst du doch?
Zumindestesns sagst du SHFileOperation, daß du das so willst, da FOF_FILESONLY gesetzt ist.

Zitat:

Zitat von rainerg (Beitrag 1101012)
und beim ersten Anlegen gibt es eine Rückfrage, ob das Verzechnis angelegt werden soll.

Und auch das wolltest du so, da FOF_NOCONFIRMMKDIR nicht gesetzt ist.

MSDN-Library durchsuchenShFileOperation > MSDN-Library durchsuchenSHFILEOPSTRUCT

Sir Rufo 16. Mai 2011 07:29

AW: Probleme mit SHFileOperation
 
Windows hat natürlich ein Problem,dass es sich entscheiden muss, wenn bei
Delphi-Quellcode:
MyCopy('c:\source_path\', 'c:\dest_path');
Code:
C:\dest_path
nicht existiert.

Was soll es werden? Eine Datei oder ein Verzeichnis?

Somit wäre mein letzter Vorschlag für einen Versuch noch folgende Schreibweise
Delphi-Quellcode:
MyCopy('c:\source_path', 'c:\dest_path\');
.

Denn es gibt einen Unterschied zwischen einem Verzeichnis und einem Pfad.
Code:
C:\MeinVerzeichnis
C:\MeinPfad\
Eine Pfadangabe hat immer den PathDelimiter am Ende stehen, andernfalls ist es ein Verzeichnis (oder sogar eine Datei)

rainerg 16. Mai 2011 07:55

AW: Probleme mit SHFileOperation
 
Zitat:

Zitat von himitsu (Beitrag 1101017)
Zitat:

Zitat von rainerg (Beitrag 1101012)
'Eigentlich' läuft das damit, ABER ...
so werden Unterverzeichnisse nicht mitkopiert

Aber genau das willst du doch?
Zumindestesns sagst du SHFileOperation, daß du das so willst, da FOF_FILESONLY gesetzt ist.
...
Und auch das wolltest du so, da FOF_NOCONFIRMMKDIR nicht gesetzt ist.
...

Öh, okay - dann sollte ich mir die Parameter nochmal genauer anschauen - ich habe (zugegebenermaßen, die Sache einfach nur dumm kopiert!


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