![]() |
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Zitat:
Also, der gesamte Pfad (Datei + Verzeichnis), ohne Laufwerk ( C:\ ) darf nicht länger als 256 Zeichen sein (inkl. der #0 oder war's ohne dieser :gruebel: ) , zumindestens ist das bei den standardmäßig vorhandenen FAT- und NTFS-Treibern so. 2. Und was ist mit einem
Delphi-Quellcode:
?
'\\.\'
|
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Zitat:
Zitat:
Oder kann es vielleicht sein, das SHFileOperation mit diesen Präfixen nicht klar kommt? |
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Okay, so scheint es zu funktionieren:
Delphi-Quellcode:
function ShellFileCopy(const aSource, aDest: string): Integer;
var SH: TSHFileOpStructW; sSource, sDest: WideString; const sPrefix: WideString = '\\?\'; sUNCNewPrefix: WideString = '\\?\UNC'; sUNCPrefix: WideString = '\\'; begin if not StartsText(sUNCPrefix, aSource) then sSource := ExpandFileName(aSource); if not StartsText(sUNCPrefix, aDest) then //sDest := ExtractFilePath(ExpandFileName(aDest)); sDest := ExpandFileName(aDest); if (Length(sSource) >= MAX_PATH) and not StartsText(sPrefix, sSource) then if StartsText(sUNCPrefix, sSource) then sSource := sUNCNewPrefix + sSource else sSource := sPrefix + sSource; if (Length(sDest) >= MAX_PATH) and not StartsText(sPrefix, sDest) then if StartsText(sUNCPrefix, sDest) then sDest := sUNCNewPrefix + sDest else sDest := sPrefix + sDest; ZeroMemory(@SH, SizeOf(SH)); try with SH do begin Wnd := 0; wFunc := FO_COPY; pFrom := PWideChar(sSource + #0); pTo := PWideChar(sDest + #0); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT; end; Result := SHFileOperationW(SH); finally ZeroMemory(@SH, SizeOf(SH)); end; end; |
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Mit Freude habe ich HeikoAdams Code übernommen, da er mir sehr gut zupass kam.
Bei der Verwendung stellt sich dann aber heraus, dass er ein paar Fallstricke enthält. So berücksichtigt der Code leider nicht den Fall, dass der Anwender (so wie ich) von sich aus bereits ein '\\?\' vor die Dateinamen setzt. In einem solchen Fall enthalten sQuelle und sZiel nur leere Strings, aber leider liefert die Funktion trotzdem (!) eine 0 als Zeichen für eine korrekte Ausführung. Und, wie schon bemerkt, darf man leider auch nicht einfach ein '\\?\' vor alle Dateinamen setzen. Bei Dateinamen >= MAX_PATH muss es stehen, bei kürzeren darf es nicht stehen. Das muss man nicht verstehen, vor allem nicht, da Microsoft ![]() ![]() Ich habe daher den Code etwas umgegraben. Für mich funktioniert er; das tat er bei HeikoAdams aber auch, warten wir also wieder drei Jahre. :wink: PS: Ich ziehe den Code zurück, siehe Beitrag unten. |
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Scheint das Thema zu sein:
![]() |
AW: SHFileOperation: Wie Dateien mit sehr langem Dateinamen kopieren?
Ich habe meine Codeanpassung wieder zurückgezogen, da der Code in seltenen, aber in der Praxis vorkommenden Fällen nicht funktioniert.
Hierbei habe ich vor allem auch ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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