![]() |
Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Moin, moin
Ich hab hier grade das Problem das ich Dateien von einem Ort zum annderen Kopieren will. DAs ganze soll abwärtskompativle bis Windows XP sein. Problematisch ist es in der Hinsicht, dass die Pfade länger als 260 Zeichen sein sollen. Ich hab jetzt etwas gegooglet und gelesen das die Windows-API ab 260 Zeichen den Dienst verweigert. Ausprobiert habe ich es mit ShFileOperation() welche dieses Verhalten bestätigt. Ich hab allerdings auch noch geleseen das verschieden Filesysteme allerdings durchaus längere Pfade handeln. Ich würde daraus den Schluss ziehen, dass mein Problem nicht zu lössen ist, da ich bei jeder Delphifunktion die mit dem Betriebsystem interagiert ja auch eine API-Funktion zugreife. Lieg ich da soweit korrekt oder entgeht mir da schlicht etwas? mit freundlichen Grüßen Phaeraun |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Pfade haben nunmal eine maximale Länge von 260 und das kannst du nicht ändern, da ein fester Puffer verwendet wird.
> 256 für den Pfad (das berühmte Byte) + 3 für das Laufwerk (C:\) + 1 für die abschließende #0 (also eigentlich nur 259 :zwinker:) (kann auch sein, daß es 255+3+2 war, aber egal) PS: Als böser "relativer" Pfad geht manchmal auch mehr als "insgesamt" 256, da die 256 auf den relativen Teil bezogen sind und mehrere Relative, bzw. ein Absoluter plus ein/mehrere Relative mehr ergeben. Du kannst aber versuchen den Pfad via ![]() |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
hm okay, wolte mit der Nachfrage auch nochmal sichergehen das ich da Wirklich gegen eine Architektonische Grenze gelaufen bin und nicht irgendwas übersehen habe. Danke für die Antwort.
|
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Also das mit der Länge über 260 Zeichen kann u. U. noch klappen, aber nur bedingt. In der Regel klappt es nicht. Ist der Pfad länger, kann man u. U. da keine neue Datei erstellen oder öffnen. Was aber (auch nur u. U.) klappt, das ist Verschieben. Verschiebt man es in eines tieferes Verzeichnis, merkt man, dass die Daten da sind, man konnte nur nicht auf sie zugreifen.
|
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Moin Zusammen,
auch wenn das für ein solches Programm nicht praktikabel ist, gibt es doch einen Weg das Problem der Pfadlänge zu umgehen. Hierzu muss man nur, mit Hilfe des Konsolenprogrammes SUBST, einem Unterverzeichnis einen Laufwerksbuchstaben verpassen. Somit lässt sich der gesamte Pfad auf eine Datei i.d.R. erheblich eindampfen, so dass der Zugriff wieder möglich ist. (dass nur als grundsätzlicher Tip, da ich auf diesem Wege schon Dateien bearbeiten konnte, die ansonsten, auf Grund der Pfadlänge, nicht mehr zu bearbeiten waren.) |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Wenn ich beim normalen Arbeiten im Explorer auf so eine Grenze laufe mache ich das auch :-D
Einfach mit
Delphi-Quellcode:
ein Laufwerk anlegen (oder seit Win8 direkt im Explorer möglich).
subst
Aber ja, mittels UNC-Notation ist das Limit an sich ja eigentlich bei 32.000 Zeichen (glaube ich). Nur leider halt trotzdem möglich, auf irgendeine WinAPI-Routine zu laufen, die keine UNC-Pfade annimmt. ![]() |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Wie gesagt, der offizielle Weg geht z.B. über UNC (maximal 64 KB, also halb so viele UnicodeZeichen = 32.767 + 1)
oder man splittet den Pfad auf. - relative Pfade, was aber im Explorer nicht geht - verschieben, wobei natürlich nur der Pfad für das zu verschiebende Verzeichnis beachtet behandelt wird - einen langen übergeordneten Verzeichnisnamen vorübergehend in was Kurzes umbenennen - oder eben aufteilen, so ala SUBST und Co. - Und wenn es im Dateisystemtreiber nicht deaktiviert ist (das sollte bei neueren NTFS-Versionen beachtet werden), dann kann man auch die alten "alternativen" 8.3-Dateinamen verwenden, um darüber zuzugreifen. |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Zitat:
Gruß K-H |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Das gilt erstmal für die APIs, welche von diesen Programmen verwendet werden.
Und da nutzen Beide praktisch oftmals die Selben. ;) (und dazu dann nochmal Beschränkungen in den Programmen selber ... z.B. feste Puffergrößen) |
AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Ich hab das Problem mit den Pfadlängen doch lösen können und zwar mithilfe der API Funktion copyfileW() und dem prefix '\\?\'.
Hiermit ist es nähmlich möglich wesentlich längere Pfade zu nutzen.
Delphi-Quellcode:
function TForm1.CopyFileEx( ASource:String ; ADest: string; ARenameCheck: boolean = false): boolean;
const PathPrefix = '\\?\'; var error : Cardinal; pQuelle : WideString; pZiel: Widestring; wideChars1 : array[0..399] of WideChar; wideChars2 : array[0..399] of WideChar; begin // String muss mit #0#0 terminiert werden, um das Listenende zu setzen pQuelle := PathPrefix +ASource + #0#0; pZiel := PathPrefix +ADest +#0#0; setLastError(0); Result:= CopyFileW(PWideChar(pQuelle),PWideChar(pZiel),false); error := GetLastError; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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