![]() |
AW: Dateien mit Pfad kopieren
Zitat:
Delphi-Strings haben bereits eine integrierte Doppel-0 am Ende, nach dem letzten Char, welche beim Cast in den PChar ebenfalls drin bleiben. Ausnahme ist der ShortString. (der hat ausschließlich ein Längenbyte davor und keine #0 dahinter) Beim WideString weiß ich es grade nicht, aber vermutlich auch. (genaueres siehe BSTR von Microsoft ... #0 ist drin, aber bei #0#0 bin ich nicht sicher) Man kann also selbst die Null(en) anhängen, oder kann es beruhigt weglassen und die impliziten #0#0 verwenden. Die Beiden sind "String-Listen", also #0 zwischen den einzelnen Einträgen und #0#0 (also ein Leerstring #0''#0 ) als Ende. |
AW: Dateien mit Pfad kopieren
Hallo,
stimmt. wäre jetzt auch nur wegen dem s:=s + #0; Bei mir funktioniert's mit SHFileOperation mit oder ohne. Gruß |
AW: Dateien mit Pfad kopieren
Hast du dir mal überlegt genausoviele Einträge ins TO einzufügen, wie ins FROM?
In der Hilfe steht nichts davon, dass "ein" Ziel für mehrere/alle Quellen gilt. (auch wenn es zu praktisch wäre, wenn es so sein sollte) Wenn du nicht alle Felder im Record zuweist, dann solltest du den Record am Anfang unbedingt mit Nullen initialisieren. FillChar bzw. FillMemory Auch wenn man alles zuweist, so sollte/könnte man es dennoch immer machen ... einmal kann man es so nie vergessen, wenn man es immer macht und auch eventuelle FillBytes (allignment) werden mit geleert. Warum eigentlich
Delphi-Quellcode:
anstatt einem einfachem ExtractFileName?
Copy(s, LastDelimiter('\', s)+1, MAXINT)
|
AW: Dateien mit Pfad kopieren
Hallo,
wenn ich, Dich richtig verstanden habe hast du eine Verzeichnisstruktur der folgenden Art hast: C:\Bilder\Delphi\Programmmein der sich mehere Dateien befinden und in F:\Bilder\Delphi\Programmespeichern möchtest. Um dies zu machen mußt Du als erstes dir die Verzeichniststruktur vom Zielsystem zusammen bauen und danach kopieren. Das ich wie folgt machen würde.
Delphi-Quellcode:
//zB:
// Source = 'C:\Bilder\Delphi\Programmme'; //Dest = 'G:/'; // nur Path ohne Dateinamen procedure CopyPath(const SourcePath, DestPath: string); var Dest: string; Dir: TDirectory; begin Dest:= ExcludeTrailingPathDelimiter(DestPath); Dest:= StringReplace(Source,ExtractFileDrive(Source),Dest,[]); Dir.Copy(Source,Path); end; |
AW: Dateien mit Pfad kopieren
Zitat:
Der Bilderrahmen sortiert die Bilder ohne Rücksicht auf die Ordner nur nach dem Dateinamen. Alse binde ich den Ordner in den Dateinamen mit ein und ändere den Dateinamen in das Aufnahmedatum Form: Ordnername#JJJJ.MM.TT-SS.mm.ss.jpg. Dann werden die Bilder in der richtigen Reihenfolge angezeigt. Ich muss nur darauf achten, falls es mehrere Fotografen gibt. Jetzt will ich diese Ordnerstruktur auf die SD-Karte kopieren. Das sind ca. 1000 Bilder und das dauert, deshalb wäre eine Fortschrittsanzeige nützlich. Mit ShellExecute(...XCopy...) geht es, aber es ist nicht zu sehen, wann der Kopiervorgang zu Ende ist. Deshalb will ich SHFileOperation benutzen. Reinhold, deinen Ansatz muss ich ausprobieren. Willie. |
AW: Dateien mit Pfad kopieren
Bin etwas verwirrt gerade was dieses Thema angeht, also korrigiert mich wenn ich jetzt falsch liege.
Es soll doch Ordner X mit allen Unterordnern an einen neuen Ort kopiert werden (Durch beibehalten aller Dateinamen und (Unter-)Ordnernamen bleibt dann die Struktur auch erhalten, richtig? In Lazarus mache ich das aktuell so (nicht vom Widestring irritieren lassen):
Delphi-Quellcode:
copydir(Source, Destination);
Delphi-Quellcode:
Das funktioniert einwandfrei bisher.
//Verzeichnis kopieren
function CopyDir(SourceDirectory: WideString; DestinationDirectory: WideString): boolean; var SHFileOpStruct: TSHFileOpStruct; SourceBuffer, DestinationBuffer: array[0..255] of char; res: integer; begin try if not SysUtils.DirectoryExists(SourceDirectory) then begin Result := False; exit; end; Fillchar(SHFileOpStruct, sizeof(SHFileOpStruct), 0); FillChar(SourceBuffer, sizeof(SourceBuffer), 0); FillChar(DestinationBuffer, sizeof(DestinationBuffer), 0); StrPCopy(SourceBuffer, String(SourceDirectory)); StrPCopy(DestinationBuffer, String(DestinationDirectory)); with SHFileOpStruct do begin Wnd := 0; wFunc := FO_COPY; pFrom := @SourceBuffer; pTo := @DestinationBuffer; fFlags := FOF_ALLOWUNDO; hNameMappings := nil; lpszProgressTitle := nil; fFlags := fFlags or FOF_NOCONFIRMATION; fFlags := fFlags or FOF_SILENT; fFlags := fFlags or FOF_SIMPLEPROGRESS; fFlags := fFlags or FOF_NOCONFIRMMKDIR; end; res := SHFileOperation(SHFileOpStruct); Result := (res = 0); if not Result then begin ShowMessage(SysErrorMessage(GetLastError)); end; except Result := False; end; end; |
AW: Dateien mit Pfad kopieren
Zitat:
Mit BufferOverflow, wenn die Pfade länger als 256 255 sind. Selbst mit MAX_PATH darf es schon 260 sein (3 für "C:\" + 256 für den Pfad + eine #0) und Windows hat in vielen APIs seit 'ner Weile auch endlich das MAX_PATH als Grenze aufgehoben und es darf auch ohne UNC nun länger sein (mit UNC auch schon seit ewig länger) und wenn das als ANSI kompiliert wurde, dann raucht der Code mit Unicodedateinamen auch wunderbar ab. Wenn schon WideString als Eingang, warum dann nicht direkt die UnicodeAPI verwenden? SHFileOperationW und vermutlich TSHFileOpStructW und das nutzlose Umkopieren der Strings auch weglassen. Zitat:
Zitat:
|
AW: Dateien mit Pfad kopieren
Ich habe die Funktion bisher auch nur übernommen, kommt nicht von mir selber und habe ich keine Hand mehr angelegt und die Funktion nicht weiter betrachtet.
Und bisher hat es (ob du willst oder nicht) immer funktioniert. Das bei mir deine Beschriebenen Fälle nicht aufgetreten sind/auftreten werden kann natürlich sein. |
AW: Dateien mit Pfad kopieren
Zitat:
Ich bleibe zunächst bei meiner Lösung mit Xcopy. Sie mag höheren Ansprüchen nicht genügen aber sie funktioniert. Willie. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 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