AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
|
AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
Zitat:
Grüße Dalai |
AW: Extrem langen Pfad kürzen, Result leer?
Hmm..
Damit geht es:
Delphi-Quellcode:
Selbst unter Delphi 6 ;)
// nur wenn NtfsDisable8dot3NameCreation=0
function GetShortName(sLongName: WideString): WideString; var sShortName: WideString; nShortNameLen: Integer; begin sShortName := ''; nShortNameLen := 0; nShortNameLen := GetShortPathNameW(PWideChar(sLongName), nil, nShortNameLen); if nShortNameLen > 0 then begin SetLength(sShortName, nShortNameLen); nShortNameLen := GetShortPathNameW(PWideChar(sLongName), PWideChar(sShortName), nShortNameLen); if (nShortNameLen = 0) then raise Exception.Create(SysErrorMessage(GetLastError)); Result := sShortName; end else begin raise Exception.Create(SysErrorMessage(GetLastError)); end; Result := sShortName; end; procedure TForm1.Button1Click(Sender: TObject); var s : Widestring; begin s := '\\?\D:\0123456789\11111111111111111111111111111111111111111111111111'; s := s + '\22222222222222222222222222222222222222222222222222'; s := s + '\33333333333333333333333333333333333333333333333333'; s := s + '\44444444444444444444444444444444444444444444444444'; s := s + '\55555555555555555555555555555\Datei.txt'; Edit1.Text := GetShortName(s); // \\?\D:\012345~1\111111~1\222222~1\333333~1\444444~1\555555~1\Datei.txt end; Bedingt aber, das NtfsDisable8dot3NameCreation=0 gesetzt ist, eventuell VOR dem Erzeugen der Verzeichnisse und der Datei. |
AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
|
AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
Zitat:
Du sagst ja selbst.. Zitat:
gruss |
AW: Extrem langen Pfad kürzen, Result leer?
Hmm...
Tja, wo seitens NTFS keine 8.3 Namen erzeugt/hinterlegt wurden, da kann mann auch keinen kurzen Namen bekommen... Deshalb sollte die Funktion dann immer den original Namen, also ungekürzt liefern, wenn dieser nicht vorhanden ist. Denn der kurze Name ist im NTFS hinterlegt und wird nicht neu erzeugt, wenn man GetShortPathName verwendet. Viele APIs ermöglichen das Verwenden in der W-Version von '\\?\', somit kann da auch gelöscht und kopiert werden. Nur der Windows-Explorer kann das nicht ;) |
AW: Extrem langen Pfad kürzen, Result leer?
Zitat:
Grüße Dalai |
AW: Extrem langen Pfad kürzen, Result leer?
NtfsDisable8dot3NameCreation bedeutet "nur", dass nicht gleich zu Beginn auch immer der 8.3-Dateiname erzeugt wird. (hatte ich so mal irgendwo gelesen, aber kann auch nur Aberglaube sein)
Wenn es nötig ist, sollte Windows diesen Pfadnamen dennoch erstellen. Allerdings kann es sein dass GetShortPathName nur bestehende Namen abfragt und bei Nichtexistenz die Arbeit einfach abbricht. Man könnte es explizit mit der ANSI-Version dieser API versuchen. Bei ANSI greifen in vielen APIs oftmals Sicherheitsmaßnamen (abwärtskompatibilität), wo dann dennoch diese kurzen "DOS"-Namen generiert werden. Und ja, auch der Explorer kann mit überlangen Pfaden umgehen, aber wie bei den meisten APIs nur für relative Pfade oder bei Verwendung von UNC. Ebenso verstehen viele (nicht alle) überlange Pfade nur via UNC. Gilt aber oftmals nicht für APIs, die Pfadnamen "manipulieren" und das in "statischen" Puffern erledigen, wie eventuell bei GetShortPathName. |
AW: Extrem langen Pfad kürzen, Result leer?
Also, ich verstehe das so. Wenn aktiviert, speichert/erzeugt Windows neben bei noch die kurzen Dateinamen. Wenn deaktiviert hat man Pech, weil Windows nur die langen Dateinamen/Pfade kennt. Ergo sum. Wenn vorher deaktiviert, hat der Threadersteller keine Chance auf die kurzen Dateinamen/Pfade zu zugreifen, weil sie nicht esxistieren.
|
AW: Extrem langen Pfad kürzen, Result leer?
Hmm..
Also, der Default-Wert von NtfsDisable8dot3NameCreation ist übrigens '2' und nicht '0'. Früher gab es nur 0 und 1 und seit zumindestens Windows7 (glaube ich) gibt es noch 2 und 3. Zitat:
Unter meinem Win8.1 stand es auf 2 und die kurzen Namen wurden nicht generiert. Erst nach dem Umstellen (und Neubooten) wurden auch die Kurzen Namen bei Neuanlage des Verzeichnisses erzeugt. Die ANSI-Version von GetShortPathName kann übrigens auch keine ShortNames bringen, wenn im File-System keine vorhanden sind. Auch ist die ANSI-Version auf MAX_PATH begrenzt und nur die Wide-Version kann die 32K langen FileNames. Somit sollte sich der TE nicht darauf verlassen, dass er die Shotnames auf anderen Systemen bekommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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