AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Extrem langen Pfad kürzen, Result leer?
Thema durchsuchen
Ansicht
Themen-Optionen

Extrem langen Pfad kürzen, Result leer?

Ein Thema von a.def · begonnen am 2. Jan 2017 · letzter Beitrag vom 3. Jan 2017
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Extrem langen Pfad kürzen, Result leer?

  Alt 3. Jan 2017, 01:16
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#2

AW: Extrem langen Pfad kürzen, Result leer?

  Alt 3. Jan 2017, 05:33
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:
Value and Meaning

0 NTFS creates short file names. This setting enables applications that cannot process long file names and computers that use differentcode pages to find the files.

1 NTFS does not create short file names. Although this setting increases file performance, applications that cannot process long file names, and computers that use different code pages, might not be able to find the files.

2 NTFS sets the 8.3 naming convention creation on a per volume basis.

3 NTFS disables 8dot3 name creation on all volumes except the system volume.

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.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Extrem langen Pfad kürzen, Result leer?

  Alt 3. Jan 2017, 10:09
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

Geändert von a.def ( 3. Jan 2017 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:04 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