Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien (https://www.delphipraxis.net/179294-problem-mit-der-maximalen-pfadlaenge-und-dem-kopieren-von-dateien.html)

Phaeraun 25. Feb 2014 10:36

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

himitsu 25. Feb 2014 10:47

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 UNC anzugeben. (viele Dateifunktionen unterstützen Dieses)

Phaeraun 25. Feb 2014 11:05

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.

Popov 25. Feb 2014 11:16

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.

Christian Seehase 25. Feb 2014 11:33

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.)

Der schöne Günther 25. Feb 2014 11:41

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:
subst
ein Laufwerk anlegen (oder seit Win8 direkt im Explorer möglich).

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.

http://msdn.microsoft.com/en-us/libr...9.aspx#maxpath

himitsu 25. Feb 2014 11:49

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.

p80286 25. Feb 2014 11:58

AW: Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
 
Zitat:

Zitat von himitsu (Beitrag 1249487)
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)

Jetzt muß ich mal dumm Nachfragen gilt das sowohl für die Konsole als auch den Explorer (und verwandte?)

Gruß
K-H

himitsu 25. Feb 2014 12:08

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)

Phaeraun 26. Feb 2014 09:58

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 08:11 Uhr.
Seite 1 von 2  1 2      

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