Lange Pfadnamen
Moderators: Hacker, Stefan2, white
Lange Pfadnamen
Ich möchte das Thema http://www.ghisler.ch/board/viewtopic.php?t=1607 nicht verwässern und eröffne deshalb einen neuen Thread zum Thema "Lange Pfadnamen".
Ich habe in diesem Zusammenhang einen schwerwiegenden Fehler entdeckt, der wie folgt reproduzierbar auftritt:
1. Ich wähle ein Verzeichnis, das viele Unterverzeichnisse enthält, die eine Gesamtpfadlänge > 256 Zeichen haben.
2. Ich wechsele in die Baumansicht und wechsele durch Drücken der "Rechts"-Taste in die Unterverzeichnisse.
3. Ich kann in ein Verzeichnis wechseln, dessen Pfadlänge 260 Zeichen enthält. An dieser Stelle sei angemerkt, dass sich in der Ansicht "lang" dieses Verzeichnis nicht öffnen läßt, nur das "darüberliegende", dass insgesamt nur 242 Zeichen lang ist.
4. Wenn ich nun noch einmal nach rechts drücke erhalte ich folgende Meldung:
---------------------------
Total Commander
---------------------------
Access violation at address 00442BD5. Read of address 6D756E5F.
Please report this error to the Author,
with a description of what you were doing when this error occured!
Continue execution?
---------------------------
Ja Nein Vielleicht
---------------------------
In dem Verzeichnis dessen Pfadlänge 260 Zeichen überschreitet existieren noch weitere Unterverzeichnisse.
Ich habe in diesem Zusammenhang einen schwerwiegenden Fehler entdeckt, der wie folgt reproduzierbar auftritt:
1. Ich wähle ein Verzeichnis, das viele Unterverzeichnisse enthält, die eine Gesamtpfadlänge > 256 Zeichen haben.
2. Ich wechsele in die Baumansicht und wechsele durch Drücken der "Rechts"-Taste in die Unterverzeichnisse.
3. Ich kann in ein Verzeichnis wechseln, dessen Pfadlänge 260 Zeichen enthält. An dieser Stelle sei angemerkt, dass sich in der Ansicht "lang" dieses Verzeichnis nicht öffnen läßt, nur das "darüberliegende", dass insgesamt nur 242 Zeichen lang ist.
4. Wenn ich nun noch einmal nach rechts drücke erhalte ich folgende Meldung:
---------------------------
Total Commander
---------------------------
Access violation at address 00442BD5. Read of address 6D756E5F.
Please report this error to the Author,
with a description of what you were doing when this error occured!
Continue execution?
---------------------------
Ja Nein Vielleicht
---------------------------
In dem Verzeichnis dessen Pfadlänge 260 Zeichen überschreitet existieren noch weitere Unterverzeichnisse.
Lefteous,
TIA
Roman
Nur aus reiner Neugier, was macht der Vielleicht Button?Continue execution?
---------------------------
Ja Nein Vielleicht
---------------------------
TIA
Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
Das untenstehende C++Programm erstellt, ausgehend von einem per Parameter übergebenen Verzeichnis, 300 Unterverzeichnisse.
Primär geht es mir darum herauszufinden, welche anderen außer dem Fehler mit dem Verzeichnisbaum noch auftreten.
Ich habe das Programm unter Windows XP Pro getestet. Ich wäre über Feedback über das Verhalten unter anderen Betriebssystemen (vorallem Windows 9x) dankbar.
Ich bitte alle Interessierten das Programm einmal zu übersetzen. Es gibt hier vorallem eines zu beachten:
Wenn man das Programm als Unicode-Version übersetzt werden 300 Verzeichnisse erstellt. Am Ende kommt ein Hinweis.
Wenn man das Programm als nicht Unicode-Version übersetzt werden gerade soviele Verzeichnisse erstellt, wie in einen 256 Zeichen langen Pfad passen. Das Programm bricht mit einer Fehlermeldung ab.
Ich habe mit Absicht keinen Link zu einer EXE-Datei gepostet, um die Hemmschwelle etwas zu erhöhen. Man sollte das ganze nur machen, wenn man wirklich weiß, was man tut und auch den Programmtext versteht.
Erläuterung zum Programmcode :
Hier sieht man, dass eigentlich nichts Ungewöhnliches gemacht wird.
Einzige Ausnahme: \\?\ wird vor den String gestellt.
Eine interessante Adresse zu diesem Thema:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/naming_a_file.asp
Benutzungsbeispiel:
Mkdirs.exe C:\Gustav
C:\Gustav\ führt zu einer Fehlermeldung.
C:\Gustav muss existieren.
Man brauch natürlich die Rechte um in C:\Gustav Verzeichnisse anlegen zu dürfen.
Haftungsausschluß: Ich übernehme keinerlei Haftung für von dem Programm verursachte Schäden an Soft- und oder Hardware.
Warnung: Ich weise ausdrücklich darauf hin, dass die von einer Unicode-Version dieses Programms erstellten Verzeichnisse mit dem Total Commander 5.51 nicht gelöscht werden können.
Ich hatte übrigens schon öfter mal (von anderen Programm erstellte) Pfade, die länger als 256 Zeichen waren. In diesem Fall half es die Ordner umzubenennen (z.b von "langlanglanglanglanglang" in "1". So wurde der Pfad dann Stück für Stück immer kürzer. Das wird in diesem Fall aber nichts nützen, weil ein Verzeichnisname mindestens aus einem Zeichen bestehen muss, aber 300 Ordner angelegt werden. Also ist der Pfad mindestens 300 Zeichen lang.
Primär geht es mir darum herauszufinden, welche anderen außer dem Fehler mit dem Verzeichnisbaum noch auftreten.
Ich habe das Programm unter Windows XP Pro getestet. Ich wäre über Feedback über das Verhalten unter anderen Betriebssystemen (vorallem Windows 9x) dankbar.
Ich bitte alle Interessierten das Programm einmal zu übersetzen. Es gibt hier vorallem eines zu beachten:
Wenn man das Programm als Unicode-Version übersetzt werden 300 Verzeichnisse erstellt. Am Ende kommt ein Hinweis.
Wenn man das Programm als nicht Unicode-Version übersetzt werden gerade soviele Verzeichnisse erstellt, wie in einen 256 Zeichen langen Pfad passen. Das Programm bricht mit einer Fehlermeldung ab.
Ich habe mit Absicht keinen Link zu einer EXE-Datei gepostet, um die Hemmschwelle etwas zu erhöhen. Man sollte das ganze nur machen, wenn man wirklich weiß, was man tut und auch den Programmtext versteht.
Erläuterung zum Programmcode :
Hier sieht man, dass eigentlich nichts Ungewöhnliches gemacht wird.
Einzige Ausnahme: \\?\ wird vor den String gestellt.
Eine interessante Adresse zu diesem Thema:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/naming_a_file.asp
Benutzungsbeispiel:
Mkdirs.exe C:\Gustav
C:\Gustav\ führt zu einer Fehlermeldung.
C:\Gustav muss existieren.
Man brauch natürlich die Rechte um in C:\Gustav Verzeichnisse anlegen zu dürfen.
Haftungsausschluß: Ich übernehme keinerlei Haftung für von dem Programm verursachte Schäden an Soft- und oder Hardware.
Warnung: Ich weise ausdrücklich darauf hin, dass die von einer Unicode-Version dieses Programms erstellten Verzeichnisse mit dem Total Commander 5.51 nicht gelöscht werden können.
Ich hatte übrigens schon öfter mal (von anderen Programm erstellte) Pfade, die länger als 256 Zeichen waren. In diesem Fall half es die Ordner umzubenennen (z.b von "langlanglanglanglanglang" in "1". So wurde der Pfad dann Stück für Stück immer kürzer. Das wird in diesem Fall aber nichts nützen, weil ein Verzeichnisname mindestens aus einem Zeichen bestehen muss, aber 300 Ordner angelegt werden. Also ist der Pfad mindestens 300 Zeichen lang.
Code: Select all
#include <tchar.h>
#include <windows.h>
#include <string>
using namespace std;
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nCmdShow)
{
// Konstanten
const int BUFFER_SIZE = 0xFFFF;
const basic_string<TCHAR> PREFIX = TEXT("\\\\?\\");
const basic_string<TCHAR> SEP = TEXT("\\");
const basic_string<TCHAR> COMMAND_LINE = lpCmdLine;
// Kommandozeilenparameter interpretieren
basic_string<TCHAR> root = PREFIX + COMMAND_LINE;
if (root.length() == PREFIX.length())
{
MessageBox (NULL, TEXT("Kein Startverzeichnis angegeben."), TEXT("ERROR!") , MB_ICONERROR);
return -1;
}
else if (root.substr(root.length() -1, root.length()) == SEP)
{
MessageBox (NULL, TEXT("Startverzeichnis bitte ohne abschließenden Separator angeben."), TEXT("ERROR!") , MB_ICONERROR);
return -1;
}
// Startverzeichnis setzen
if (!SetCurrentDirectory(root.c_str()))
{
MessageBox (NULL, TEXT("Startverzeichnis konnte nicht gesetzt werden."), TEXT("ERROR!") , MB_ICONERROR);
return -1;
}
// Verzeichnise erstellen
TCHAR dirNameBuffer [BUFFER_SIZE+1];
int pathPosition = _stprintf(dirNameBuffer,TEXT("%s"), root.c_str());
for (int dirNumber = 1; dirNumber <= 300; dirNumber++)
{
pathPosition += _stprintf(&(dirNameBuffer[pathPosition]),TEXT("\\Verzeichnis %d"), dirNumber);
if (!CreateDirectory(dirNameBuffer,NULL))
{
TCHAR dirErrorBuffer [BUFFER_SIZE+1];
_stprintf (dirErrorBuffer, TEXT("Verzeichnis %s konnte nicht erstellt werden."), dirNameBuffer);
MessageBox (NULL, dirErrorBuffer, TEXT("ERROR!") , MB_ICONERROR);
return -1;
}
}
TCHAR dirResultBuffer [BUFFER_SIZE+100];
_stprintf (dirResultBuffer, TEXT("Verzeichnis %s wurde erfolgreich erstellt."), dirNameBuffer);
MessageBox (NULL, dirResultBuffer, TEXT("Info!") , MB_ICONINFORMATION);
return 0;
}
- ghisler(Author)
- Site Admin
- Posts: 50475
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Total Commander unterstützt nur Pfade bis max. 259 Zeichen, weil die ANSI-Dateifunktionen von Windows nur bis 259 Zeichen arbeiten. Nur die Unicode-Funktionen können mehr, wenn man wie oben beschrieben \\?\ voranstellt - nur fehlen diese Unicode-Funktionen leider unter Win9x.
Eine Access violation sollte es trotzdem nicht geben - das mit dem Baum muss ich wohl übersehen haben, danke für die Meldung.
Eine Access violation sollte es trotzdem nicht geben - das mit dem Baum muss ich wohl übersehen haben, danke für die Meldung.
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
2ghisler(Author)
Wäre es nicht an der Zeit zu der bisher erhältlichen ANSI-Version auch einer UNICODE-Version anzubieten - eine Windows NT-Version sozusagen. Schließlich gibt es auch eine Windows 3.1 Version. Außerdem sind bei einer UNICODE-Version keine Änderungen am Quellcode notwendig, zumindest bei einem generischen C(++)-Programm- einfach neue übersetzen und fertig ist die UNICODE-Version.
Nun ist ja der Total Commander ein Delphi-Programm und da ist das gewiss schwieriger, aber irgendwie musst das doch gehen, oder? Sorry, ich bin nicht so der Delphi-Insider.
Wäre es nicht an der Zeit zu der bisher erhältlichen ANSI-Version auch einer UNICODE-Version anzubieten - eine Windows NT-Version sozusagen. Schließlich gibt es auch eine Windows 3.1 Version. Außerdem sind bei einer UNICODE-Version keine Änderungen am Quellcode notwendig, zumindest bei einem generischen C(++)-Programm- einfach neue übersetzen und fertig ist die UNICODE-Version.
Nun ist ja der Total Commander ein Delphi-Programm und da ist das gewiss schwieriger, aber irgendwie musst das doch gehen, oder? Sorry, ich bin nicht so der Delphi-Insider.
Christian arbeitet an einer Version die sowohl ANSI als auch UNICODE benutzen wird, das braucht aber seine Zeit, weil jede ANSI-Funktion ein Schwesterchen in UNICODE bekommen muss.
Siehe auch http://ghisler.ch/board/viewtopic.php?t=1266&start=15
HTH
Roman
Siehe auch http://ghisler.ch/board/viewtopic.php?t=1266&start=15
HTH
Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
-
- Junior Member
- Posts: 16
- Joined: 2009-01-26, 10:12 UTC
- Contact:
Lange Verzeichnisse ...
Ich muß zugeben, daß ich hier nicht alle Beiträge zu Verezeichnislänge durchgelesen habe, aber ist es BITTE möglich, in den nächsten Version die VOLLE Länge von ca 32k Zeichen für den Pfad zu ermöglichen ?
Ich arbeite hier viel mit MountPoints und Netzwerk-Verzeichnissen auf Linux-Servern, die regelmäßig mehr als 250 und meistens mehr als 1024 Zeichen lange Pfadnamen haben.
Eine Tendenz, die bei größer werdenden Datenmengen eher zunimmt!
Ich würde es als schade empfinden in Zukunft den TC nicht mehr benutzen zu können.
Gruß
/HB
Ich arbeite hier viel mit MountPoints und Netzwerk-Verzeichnissen auf Linux-Servern, die regelmäßig mehr als 250 und meistens mehr als 1024 Zeichen lange Pfadnamen haben.
Eine Tendenz, die bei größer werdenden Datenmengen eher zunimmt!
Ich würde es als schade empfinden in Zukunft den TC nicht mehr benutzen zu können.
Gruß
/HB
- sqa_wizard
- Power Member
- Posts: 3893
- Joined: 2003-02-06, 11:41 UTC
- Location: Germany
In TC 7.50 = 1024 Zeichen (siehe Punkt 11)ist es BITTE möglich, in den nächsten Version die VOLLE Länge von ca 32k Zeichen für den Pfad zu ermöglichen ?
#5767 Personal license
-
- Junior Member
- Posts: 16
- Joined: 2009-01-26, 10:12 UTC
- Contact:

Danke - hatte ich schon gelesen ...ist es BITTE möglich, in den nächsten Version die VOLLE Länge von ca 32k Zeichen für den Pfad zu ermöglichen ?In TC 7.50 = 1024 Zeichen (siehe Punkt 11)
Was ist den der EIGENTLICHE Grund die Pfadlänge auf 1024 zu begrenzen - oder falls Begrenzung gewünscht - diese nicht konfigurierbar zu machen ?
Ich entwickle selbst Software ... und mir fällt kein plausibler Grund ein ...

- sqa_wizard
- Power Member
- Posts: 3893
- Joined: 2003-02-06, 11:41 UTC
- Location: Germany