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 1 von 3  1 23      
a.def
(Gast)

n/a Beiträge
 
#1

Extrem langen Pfad kürzen, Result leer?

  Alt 2. Jan 2017, 19:32
Wie würde man korrekt einen zu langen Pfad kürzen?
Ich habe eine Teststruktur die so aussieht:

Code:
D:\0123456789\11111111111111111111111111111111111111111111111111\22222222222222222222222222222222222222222222222222\
33333333333333333333333333333333333333333333333333\44444444444444444444444444444444444444444444444444\
55555555555555555555555555555555555555555555555555\datei.txt
Dieser Pfad ist so lang, dass ich das Verzeichnis 0123456789 selbst nicht mehr mit Windows kopiert bekomme.
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;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

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

  Alt 2. Jan 2017, 19:45
Delphi müsste eigentlich ExtractShortPathName kennen (SysUtils).

ExtractShortPathName('C:\Program Files\MyCompany\MyApp\MyApp.exe') sollte "C:\Progra~1\MyComp~1\MyApp\MyApp.exe" liefern.

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
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

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

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

  Alt 2. Jan 2017, 19:47
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:
\\?\D:\0123456789\...
IIRC wird aber diese Syntax nicht von allen API-Funktionen unterstützt.

Grüße
Dalai
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

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

  Alt 2. Jan 2017, 19:50
Keine Ahnung ob das relevant für Win7 ist. (Falls du es benutzt)
Check mal in der Registry ob 8dot3NameCreation aktiviert bzw. deaktiviert ist.

http://www.msfn.org/board/topic/1352...comment=986576

gruss

Geändert von EWeiss ( 2. Jan 2017 um 19:58 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

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

  Alt 2. Jan 2017, 20:05
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?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

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

  Alt 2. Jan 2017, 20:33
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 2. Jan 2017, 20:34
MAX_PATH ist der komplette "Pfad", inkl. Datei-/Verteichnisname, Verzeichnisse, Laufwerk und der letzten #0.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

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

  Alt 2. Jan 2017, 20:38
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?
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 2. Jan 2017, 21:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

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

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

  Alt 2. Jan 2017, 21:20
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.
... was auch über die WinAPI erfolgt - insofern widerspricht der zweite Satz dem ersten .

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: MSDN-Library durchsuchenCopyFileEx:
Zitat:
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.
Es muss also die Unicode-Variante der Funktion gerufen werden, der Prefix muss vorhanden sein, und natürlich darf man den String nicht auf MAX_PATH kürzen. Und wie ich schon sagte können möglicherweise nicht alle API-Funktionen mit den überlangen Pfaden umgehen; LoadImage, LoadIcon fallen mir da spontan ein.

Grüße
Dalai

Geändert von Dalai ( 2. Jan 2017 um 21:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:09 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