Lange Pfadnamen

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Lefteous
Power Member
Power Member
Posts: 9536
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Lange Pfadnamen

Post by *Lefteous »

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.
CoolWater
Power Member
Power Member
Posts: 744
Joined: 2003-03-27, 16:33 UTC

Post by *CoolWater »

das prob. wird darin bestehen, das der Puffer für den Pfad auf 260 festgesetzt ist... alles was darüber hinausgeht, produziert einen Speicherfehler... :(
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Lefteous,
Continue execution?
---------------------------
Ja Nein Vielleicht
---------------------------
Nur aus reiner Neugier, was macht der Vielleicht Button?

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.
User avatar
Lefteous
Power Member
Power Member
Posts: 9536
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Hacker
Nur aus reiner Neugier, was macht der Vielleicht Button?
Kleiner Scherz am Rande ;-)
Man sieht, dass Du meinen Beitrag intensiv und aufmerksam gelesen hast
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Kleiner Scherz am Rande
:) Dachte ich mir schon... aber 'ne nette Idee.

:)

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.
User avatar
Lefteous
Power Member
Power Member
Posts: 9536
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

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.

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;
}

User avatar
norfie
Power Member
Power Member
Posts: 1194
Joined: 2003-02-18, 14:18 UTC

Post by *norfie »

Last edited by norfie on 2004-09-10, 21:29 UTC, edited 1 time in total.
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 50475
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

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.
Author of Total Commander
https://www.ghisler.com
User avatar
Lefteous
Power Member
Power Member
Posts: 9536
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

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.
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

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
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.
User avatar
Lefteous
Power Member
Power Member
Posts: 9536
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Hacker

eine Version die beides unterstützt ist doch sicher von der Dateigrösse her ziemlich üppig. Würde mich sehr wundern, wenn das so gemacht wird - gerade auch weil mir der programmiertechnische Aufwand höher erscheint (siehe auch meine Ausführungen weiter oben).
hardbreaker
Junior Member
Junior Member
Posts: 16
Joined: 2009-01-26, 10:12 UTC
Contact:

Lange Verzeichnisse ...

Post by *hardbreaker »

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
User avatar
sqa_wizard
Power Member
Power Member
Posts: 3893
Joined: 2003-02-06, 11:41 UTC
Location: Germany

Post by *sqa_wizard »

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)
#5767 Personal license
hardbreaker
Junior Member
Junior Member
Posts: 16
Joined: 2009-01-26, 10:12 UTC
Contact:

Post by *hardbreaker »

:?
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)
Danke - hatte ich schon gelesen ...
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 ... :roll:
User avatar
sqa_wizard
Power Member
Power Member
Posts: 3893
Joined: 2003-02-06, 11:41 UTC
Location: Germany

Post by *sqa_wizard »

Im Punkt 11 ist ein Beitrag verlinkt der darauf eingeht ...
#5767 Personal license
Post Reply