![]() |
Extrem langen Pfad kürzen, Result leer?
Wie würde man korrekt einen zu langen Pfad kürzen?
Ich habe eine Teststruktur die so aussieht:
Code:
Dieser Pfad ist so lang, dass ich das Verzeichnis 0123456789 selbst nicht mehr mit Windows kopiert bekomme.
D:\0123456789\11111111111111111111111111111111111111111111111111\22222222222222222222222222222222222222222222222222\
33333333333333333333333333333333333333333333333333\44444444444444444444444444444444444444444444444444\ 55555555555555555555555555555555555555555555555555\datei.txt Ist hier Schluss mit lustig und Hopfen und Malz verloren oder kann man hier noch was machen um die Datei zu kopieren? Das Kürzen mit dieser Funktion liefert einen leeren String zurück
Delphi-Quellcode:
function GetShortName(sLongName: string): string;
var sShortName: string; nShortNameLen: Integer; begin SetLength(sShortName, MAX_PATH); nShortNameLen := GetShortPathName(PChar(sLongName), PChar(sShortName), MAX_PATH - 1); if (0 = nShortNameLen) then begin // handle errors... end; SetLength(sShortName, nShortNameLen); Result := sShortName; end; |
AW: Extrem langen Pfad kürzen, Result leer?
Delphi müsste eigentlich ExtractShortPathName kennen (SysUtils).
Delphi-Quellcode:
sollte "C:\Progra~1\MyComp~1\MyApp\MyApp.exe" liefern.
ExtractShortPathName('C:\Program Files\MyCompany\MyApp\MyApp.exe')
Aus deinem Beispiel könnte damit dann sowas werden: D:\012345~1\111111~1\222222~1\333333~1\444444~1\55 5555~1\datei.txt |
AW: Extrem langen Pfad kürzen, Result leer?
Der Pfad ist mit 278 Zeichen länger als MAX_PATH. Die allermeisten der API-Funktionen dürften damit ihre Probleme haben. Lösung: Syntax benutzen, die längere Pfade erlaubt:
Code:
IIRC wird aber diese Syntax nicht von allen API-Funktionen unterstützt.
\\?\D:\0123456789\...
Grüße Dalai |
AW: Extrem langen Pfad kürzen, Result leer?
Keine Ahnung ob das relevant für Win7 ist. (Falls du es benutzt)
Check mal in der Registry ob 8dot3NameCreation aktiviert bzw. deaktiviert ist. ![]() gruss |
AW: Extrem langen Pfad kürzen, Result leer?
1) Ist aktiviert.
2) \\?\ hat kein Auswirkung auf Pfade > MAX_PATH 3) ExtractShortPathName ebenfalls ein leerer String So wie es aussieht, gibt es hier keine Lösung. Denn Windows selber kann das Verzeichnis sogar nicht verarbeiten. Frage: gilt MAX_PATH nur für Dateinamen oder für den kompletten Pfad? |
AW: Extrem langen Pfad kürzen, Result leer?
Ich hatte neulich mit einem Backup Probleme wegen zu langer Pfade.
Es gibt dafür naheliegende und absurde Lösungen/Vorschläge. Eine Möglichkeit, die bei mir prima funktioniert hat ist die Nutzung/ Erzeugung eines Links. (So wie man sie von Unixen kennt, ich glaub MS nennt das junction) per CMD: - Link auf irgendeinen mittleren Teil des Pfades anlegen - Löschen / Ändern im Link übrig bleibenden Pfadnamen - Link löschen Das kann man iterativ machen, bis ein "normaler" Zugriff funktioniert. Wahrscheinlich sogar intelligenter, wenn man ein bisschen Längenbestimmung macht. Es ist allerdings nicht in jeder OS Version verfügbar, bis XP glaub ich, erst ab Win7, bin nicht ganz sicher. Ggf. kannst Du das programmatisch implementieren, wenn Du mit der OS Version auf der sicheren Seite bist. |
AW: Extrem langen Pfad kürzen, Result leer?
MAX_PATH ist der komplette "Pfad", inkl. Datei-/Verteichnisname, Verzeichnisse, Laufwerk und der letzten #0.
|
AW: Extrem langen Pfad kürzen, Result leer?
Kann man dementsprechend abschließend festhalten, dass wenn die Länge Pfad sPathXYZ > MAX_PATH ist, man ihn am besten aus der Verarbeitung raushält um Fehler zu vermeiden?
|
AW: Extrem langen Pfad kürzen, Result leer?
Also direkt über die Win API kann man bis Windows 8.1 nur Pfade mit der Länge von MAX_PATH kopieren. Es gab aber die bereits erwähnte Alternative mit \\?\ um Pfade zu kopieren die länger sind als MAX_PATH. Probiert habe ich das selbst nie und kann daher auch keine Lösung anbieten. Ab Windows 10 (ab einem speziellen Build soweit ich weiß) wurden die WinAPI Funktionen angepasst sodass sie Pfade bis 2^15 Zeichen verarbeiten können.
|
AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
Probiert habe ich es selbst auch nie, aber da ich weiß, dass Total Commander mit Pfaden länger 256 Zeichen umgehen kann (geht IIRC bis 1024) und der natürlich mit der WinAPI arbeitet, kann ich mit Sicherheit sagen, dass es funktioniert. Nur mal ein Beispiel: ![]() Zitat:
Grüße Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 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