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
Seite 2 von 3     12 3      
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#11

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

  Alt 2. Jan 2017, 21:23
... was auch über die WinAPI erfolgt - insofern widerspricht der zweite Satz dem ersten .
Ja ok. Wie gesagt ich habe es nie probiert und wusste es daher nicht. Aber logisch wäre es schon. Nur muss man dann scheinbar spezielle Funktionen aufrufen. Sind das alle mit "Ex" am Schluss?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#12

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

  Alt 2. Jan 2017, 21:29
Nur muss man dann scheinbar spezielle Funktionen aufrufen.
Nicht spezielle Funktionen, nur der Pfad im entsprechenden Parameter ist anders.

Zitat:
Sind das alle mit "Ex" am Schluss?
Nicht nur. Für MSDN-Library durchsuchenGetShortPathName schreibt MS denselben Satz wie für CopyFileEx, diese Funktion soll also auch damit umgehen können.

Grüße
Dalai
  Mit Zitat antworten Zitat
HolgerX

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

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

  Alt 2. Jan 2017, 21:36
Hmm..

Damit geht es:

Delphi-Quellcode:
// 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;
Selbst unter Delphi 6

Bedingt aber, das NtfsDisable8dot3NameCreation=0 gesetzt ist, eventuell VOR dem Erzeugen der Verzeichnisse und der Datei.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#14

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

  Alt 2. Jan 2017, 21:43
Bedingt aber, das NtfsDisable8dot3NameCreation=0 gesetzt ist, eventuell VOR dem Erzeugen der Verzeichnisse und der Datei.
Was dann wieder das Problem birgt, dass nicht jeder dieselben Einstellungen hat.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

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

  Alt 2. Jan 2017, 21:47
Zitat:
Bedingt aber, das NtfsDisable8dot3NameCreation=0 gesetzt ist, eventuell VOR dem Erzeugen der Verzeichnisse und der Datei.
Fein das wenigstens einer mit meinen Informationen gearbeitet hat.
Zitat:
Was dann wieder das Problem birgt, dass nicht jeder dieselben Einstellungen hat.
Wo ist das Problem diese zu setzen oder zu deaktivieren.
Du sagst ja selbst..
Zitat:
dass wenn die Länge Pfad sPathXYZ > MAX_PATH ist, man ihn am besten aus der Verarbeitung raushält um Fehler zu vermeiden?
Was hindert dich daran abhängig von der länge des strings die variable in der registry zu ändern?


gruss

Geändert von EWeiss ( 2. Jan 2017 um 21:51 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

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

  Alt 2. Jan 2017, 21:55
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

Geändert von HolgerX ( 2. Jan 2017 um 21:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#17

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

  Alt 2. Jan 2017, 22:06
Bedingt aber, das NtfsDisable8dot3NameCreation=0 gesetzt ist [...]
Da das Abspeichern/Erzeugen kurzer Dateinamen Standardeinstellung ist (d.h. man muss nur aktiv werden, wenn man das nicht will), sehe ich da kein wirkliches Problem. Es mag Gründe für das Abschalten kurzer Namen geben, aber ich denke, die meisten Leute, bei denen das der Fall ist, haben mit irgendeinem Tuning-Tool und/oder ohne ausreichendes Wissen rumgefummelt.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 3. Jan 2017, 02:10
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 MSDN-Library durchsuchenGetShortPathName 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.
$2B or not $2B

Geändert von himitsu ( 3. Jan 2017 um 02:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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

  Alt 3. Jan 2017, 02: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
972 Beiträge
 
Delphi 6 Professional
 
#20

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

  Alt 3. Jan 2017, 06: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
Antwort Antwort
Seite 2 von 3     12 3      


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 11: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