Nach einigen Tests habe ich jetzt herausgefunden, dass Windows intern wohl selbst schon den kurzen Pfad sucht, wenn man \\?\ als Prefix verwendet.
Gestern hat das nicht funktioniert.
Situaton gestern war, dass NtfsDisable8dot3NameCreation aus irgendeinem Grund nicht auf 2 stand.
Folgende Funktion klappt einwandfrei (auch ohne getShortName)
Delphi-Quellcode:
function getUNCPath(aPath: string): string;
var
bIsUNC: Boolean;
begin
aPath := ExpandFileName(aPath);
bIsUNC := Copy(aPath, 1, 2) = '\\';
if not bIsUNC then
aPath := '\\?\' + aPath;
Result := aPath;
end;
Ansonsten sieht mein Wirr-Warr jetzt so aus
Delphi-Quellcode:
function getShortName(sLongName: WideString; bReturnLongIfNotFound: Boolean = False): WideString;
var
sShortName: WideString;
nShortNameLen: Integer;
begin
Result := '';
// Prüfung auf MAX_PATH. Wenn KLEINER MAX_PATH, gebe sLongName zurück,
// da es sonst u.U. Zeit kosten kann, wenn die Datei sLongName nicht existiert.
if Length(sLongName) > MAX_PATH then
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
Result := sShortName;
end
else
begin
end;
end
else
Result := sLongName;
// Sollte Result aus irgendeinem Grund leer sein, gebe sLongName zurück (falls gewollt)
if (Result = '') and bReturnLongIfNotFound then
Result := sLongName
else
Result := sShortName;
end;
// sPath := irgendetwas, das länger als MAX_PATH ist ...
sPath := getUNCPath(sPath); // funktioniert
sPath := getShortName(getUNCPath(sPath), True); // funktioniert
// ohne eine der beiden Funktionen, funktioniert Weiteres (natürlich) nicht