AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Problem mit der Maximalen Pfadlänge und dem Kopieren von Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Phaeraun · begonnen am 25. Feb 2014 · letzter Beitrag vom 26. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
Phaeraun

Registriert seit: 23. Jul 2013
Ort: Neumünster
13 Beiträge
 
#1

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

  Alt 25. Feb 2014, 11:36
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 25. Feb 2014, 11:47
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 )
(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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Feb 2014 um 11:53 Uhr)
  Mit Zitat antworten Zitat
Phaeraun

Registriert seit: 23. Jul 2013
Ort: Neumünster
13 Beiträge
 
#3

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

  Alt 25. Feb 2014, 12:05
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

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

  Alt 25. Feb 2014, 12:16
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 25. Feb 2014, 12:33
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.)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 25. Feb 2014, 12:41
Wenn ich beim normalen Arbeiten im Explorer auf so eine Grenze laufe mache ich das auch
Einfach mit 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 25. Feb 2014, 12:49
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Feb 2014 um 12:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 25. Feb 2014, 12:58
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 )
(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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 25. Feb 2014, 13:08
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Phaeraun

Registriert seit: 23. Jul 2013
Ort: Neumünster
13 Beiträge
 
#10

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

  Alt 26. Feb 2014, 10:58
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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