"Christoph Schneegans" <Chri...@Schneegans.de> schrieb:
[...]
>> Die Maximallaenge der einzelnen (durch \ getrennten) Elemente von Pfadnamen
>> ist unveraendert 255 Zeichen.
>
> Okay, verstanden. Die Ergebnisse sind dennoch durchwachsen. Mit PowerShell
> kann ich etwa per
>
> mkdir ("C:\Users\chris\Desktop\" + "fooooooooooooooooooooooooooooooooooooooooooooooooo\" * 500)
>
> ein Verzeichnis
>
> C:\Users\chris\Desktop\fooooooooooooooooooooooooooooooooooooooooooooooooo\…\fooooooooooooooooooooooooooooooooooooooooooooooooo
>
> erstellen, und
>
> dir -path C:\Users\chris\Desktop\ -Recurse -Directory | select -Last 1 | select {$_.FullName.Length}
>
> zeigt dann auch eine imposante Pfadlänge an:
>
> $_.FullName.Length
> ------------------
> 25522
.NET und damit auch PowerShell wurden dafuer fit gemacht, indem die
Beschraenkung von EINGABE-Parametern in deren Pfadnamen bearbeitenden
Routinen auf MAX_PATH beseitigt wurde.
<
https://blogs.msdn.microsoft.com/jeremykuhne/2016/06/09/new-net-path-handling-sneak-peek/>
<
https://blogs.msdn.microsoft.com/jeremykuhne/2016/06/21/more-on-new-net-path-handling/>
<
https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/>
Bei AUSGABE-Parametern waren laengere Pfade schon immer moeglich, da
das Win32-API diese seit ueber 20 Jahren liefert, und zu kurze Puffer
natuerlich per Returncode meldet.
> Der Windows-Explorer jedoch liefert folgende Fehlermeldung, wenn ich
> versuche, das oberste Verzeichnis zu löschen:
>
> "The source file name(s) are larger than is supported by the file system."
>
> Das ist ja wohl glatt gelogen.
Korrekt: eine dummdreiste Luege, weil die Verbrecher der "shell" das
System, auf dem ihr Verbrechen laeuft, offensichtlich NICHT kennen!
> Und in cmd.exe bricht
>
> dir /s
>
> auch nach wenigen Unterverzeichnissen ab:
>
> The directory name C:\Users\chris\Desktop\…\fooooooooooooooooooooooooooooooooooooooooooooooooo is too long.
>
> Der monierte Pfad hat eine Länge von nur 277 Zeichen.
"too long" fuer den Kommandointerpreter: auch dessen Verbrecher kennen
nur MAX_PATH
Stefan
PS: kopiere mal NOTEPAD.EXE nach %windir%\TEMP und gib dann in der
Eingabeaufforderung oder bei Start->Ausfuehren TEMP\NOTEPAD.EXE ein.
Nachdem Du die dummdreiste Luege "kann TEMP\NOTEPAD.EXE nicht finden"
beider Programme gesehen hast rufst Du die Funktion CreateProcess()
(siehe
https://msdn.microsoft.com/en-us/library/ms682425.aspx)
des Win32-API wie folgt auf:
STARTUPINFO si = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION pi = {0};
CreateProcess(NULL, "TEMP\\NOTEPAD.EXE", NULL, NULL, FALSE, 0L, NULL, NULL, &si, &pi);
und wunderst Dich hoffentlich nicht, dass Windows auch relative
Pfadnamen korrekt verarbeitet.
LoadLibrary("TEMP\\NOTEPAD.EXE") funktioniert selbstverstaendlich
auch ... wie in
<
https://msdn.microsoft.com/en-us/library/ms684175.aspx> EXPLIZIT
beschrieben:
| If a relative path is specified, the entire relative path is
| appended to every token in the DLL search path list.
Bei CreateProcess() fehlt dieser explizite Hinweise dummerweise...