NTFS: Pfadlänge max. 259 Zeichen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Bei https://de.wikipedia.org/wiki/NTFS steht zwar, das Dateinamen max. 255 Zeichen lang sein dürfen... Aber es gibt eine Limitierung des gesamten Pfades auf 259 Zeichen :shock:

Hab mal ein test gehackt:
[Codebox=python file=Unbenannt.py]import os
import tempfile

with tempfile.TemporaryDirectory(prefix="path_test_") as d:
def make_sub_dirs(path):
new_path = os.path.join(path, "12345678")
try:
os.mkdir(new_path)
except FileNotFoundError as err:
print("*** %s" % err)
return path
os.chdir(new_path)
print(len(new_path), new_path)
return make_sub_dirs(new_path)

path = make_sub_dirs(d)
print(len(path), path)
filename=""
for no in range(20):
filename+=str(no)
filepath=os.path.join(path, filename)
try:
with open(filepath, "w") as f:
f.write("foo")
except FileNotFoundError as err:
print("+++ %s" % err)
break
print(len(filepath), filepath)[/Codebox]

Ausgabe ist damit:
60 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678
69 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678
78 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678
87 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678
96 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678
105 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678
114 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678
123 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
132 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
141 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
150 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
159 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
168 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
177 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
186 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
195 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
204 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
213 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
222 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
231 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
240 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
*** [WinError 206] Der Dateiname oder die Erweiterung ist zu lang: 'C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_3o0m08we\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678'
240 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
242 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0
243 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01
244 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012
245 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123
246 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234
247 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345
248 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456
249 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567
250 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678
251 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789
253 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910
255 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567891011
257 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789101112
259 C:\Users\jens\AppData\Local\Temp\path_test_3o0m08we\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910111213
+++ [Errno 2] No such file or directory: 'C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_3o0m08we\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\01234567891011121314'
Die zweite Fehlermeldung ist dabei ja ein wenig komisch :P


Die Limitierung ist allerdings nur durch die Windows API, denn NTFS kann wohl 32K Pfadlängen, aber Python nutzt anscheinend die API.

Hier ist MAX_PATH aufgeführt: https://msdn.microsoft.com/en-us/librar ... px#maxpath



Mir ist das ganze nur aufgefallen, weil ich in PyHardLinkBackup den temporären Dateinamen aus dem original generiere und dabei zufällige Zeichen anhänge. Dann wird es zu lang, wenn man z.B. alle Windows User Profile-Verzeichnisse sichert:
File "c:\users\jens\appdata\roaming\pyhardlinkbackup\lib\site-packages\PyHardLinkBackup\phlb\path_helper.py", line 23, in rename2temp
src.rename(temp_filepath)
File "C:\Program Files (x86)\Python35-32\lib\pathlib.py", line 1264, in rename
self._accessor.rename(self, target)
File "C:\Program Files (x86)\Python35-32\lib\pathlib.py", line 377, in wrapped
return strfunc(str(pathobjA), str(pathobjB), *args)
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden
-> https://github.com/jedie/PyHardLinkBack ... -176241894


Im Netz hab ich nicht viel gefunden, außer: http://www.xxcopy.com/xxtb_047.htm

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Vllt hab ichs ja in Deinem Bsp. übersehen - hast Du denn die erweiterte Notation für lange Pfade mal probiert? ("\\?\D:\very long path")
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nein, aber guter Hinweis!

Ich hab es mal probiert: Bringt aber nix:

Code: Alles auswählen

import os
import tempfile

with tempfile.TemporaryDirectory(prefix="path_test_") as path:
    path="\\\\?\\%s" % path

    def make_sub_dirs(path):
        new_path = os.path.join(path, "12345678")
        try:
            os.mkdir(new_path)
            os.chdir(new_path)
        except FileNotFoundError as err:
            print("*** %s" % err)
            return path
        print(len(new_path), new_path)
        return make_sub_dirs(new_path)

    path = make_sub_dirs(path)
    print(len(path), path)
    filename=""
    for no in range(20):
        filename+=str(no)
        filepath=os.path.join(path, filename)
        try:
            with open(filepath, "w") as f:
                f.write("foo")
        except FileNotFoundError as err:
            print("+++ %s" % err)
            break
        print(len(filepath), filepath)
Ausgabe (gekürzt):

Code: Alles auswählen

64 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678
73 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678
82 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678
91 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678
100 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678
109 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678
118 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678
127 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
136 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
145 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
154 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
163 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
172 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
181 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
190 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
199 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
208 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
217 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
226 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
235 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
244 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
253 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
*** [WinError 206] Der Dateiname oder die Erweiterung ist zu lang: '\\\\?\\C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_86io34uk\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678'
253 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
255 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0
256 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01
257 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012
258 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123
259 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234
260 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345
261 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456
262 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567
263 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678
264 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789
266 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910
268 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567891011
270 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789101112
272 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910111213
274 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567891011121314
276 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789101112131415
278 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910111213141516
280 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\01234567891011121314151617
282 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\0123456789101112131415161718
284 \\?\C:\Users\jens\AppData\Local\Temp\path_test_86io34uk\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\012345678910111213141516171819
Traceback (most recent call last):
  File "d:\test.py", line 34, in <module>
    print(len(filepath), filepath)
  File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 807, in __exit__
    self.cleanup()
  File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 811, in cleanup
    _shutil.rmtree(self.name)
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 488, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 378, in _rmtree_unsafe
...
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 378, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 383, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 381, in _rmtree_unsafe
    os.unlink(fullname)
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_86io34uk\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\0123456789'
Also die maximale Pfad länge erweitert sich von 259 auf 284... Ist jetzt nicht so die Welt, oder? Und ist nicht das maximal mögliche von NTFS, denke ich mir...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Eine dumme Frage: Kennt das UNIX-System auch eine limitierte Länge (Dateiname+Pfad)? Des Weiteren habe ich den eigentlichen Sinne dieser Begrenzung der Länge nie wirklich verstanden.
BlackJack

@Sophus: Welches UNIX-System? Wir reden hier von *Datei*systemen. NTFS hat diese Beschränkungen unabhängig von Windows. Auch unter unixoiden Systemen (Linux, MacOS, *BSD, …) hat NTFS die Längenbeschränkungen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Stimmt. Ich bin eindeutig vom Betriebssystem ausgegangen. Mein Fehler.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sophus hat geschrieben:Eine dumme Frage: Kennt das UNIX-System auch eine limitierte Länge (Dateiname+Pfad)? Des Weiteren habe ich den eigentlichen Sinne dieser Begrenzung der Länge nie wirklich verstanden.
Naja die Pfade müssen ja irgendwie gespeichert werden so dass man auch effizient auf Dateien und Ordner und deren Inhalten zugreifen kann. Ich kann mir gut vorstellen dass es da gute Gründe hat eine maximale Länge zu definieren.

Vielleicht einfach mal einen Blick in eine Spezifikation oder in eine Implementation eines Dateisystems werfen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Naja, es geht um NTFS aber der Limitierende Faktor kommt wohl vom Windows API.
Bei https://msdn.microsoft.com/en-us/librar ... px#maxpath steht was von:
In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters.
...
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the lpMaximumComponentLength parameter of the GetVolumeInformation function (this value is commonly 255 characters). To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".
Also so wie ich das verstehe, kann NTFS eigentlich mehr, aber die alte API ist halt eingeschränkt. Offensichtlich nutzt Python aber nicht die neue?!?

Bei https://en.wikipedia.org/wiki/Compariso ... ems#Limits sind die Limits schön aufgeführt...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Wenn ich mich recht entsinne, funktioniert die lange Notation auch mit Volumennamen anstelle der Laufwerksbuchstaben. Vllt. gehts damit. Falls nicht, ist Python evtl. wirklich nur gegen die Kurzvariante gelinkt. Mit einem kleinen C++ Programm oder wahlweise einem ctypes-Schnipsel könntest Du das ja mal gegen testen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Oh, man... Das ist ja zum brüllen:

Ich wollte den "Offline Cache" löschen. Also:
At the elevated command prompt, type the following command, and then press ENTER:

takeown /r /f c:\windows\csc

At the elevated command prompt, type the following command, and then press ENTER:

rd /s c:\windows\csc

Note The limitation of this method to delete the old cache is that Takeown.exe can only process paths that do not exceed the MAX_PATH (maximum length of a path). The maximum length of a path is 260 characters. If this path length exceeds the MAX_PATH, the takeown command fails.
-> https://support.microsoft.com/en-us/kb/942960

Fazit: Mit windows Bortmitteln ist das Löschen eh nicht möglich. Also man muß schon in die cmd. Was ja eh schon der Hammer ist.
Und dann kommt auch noch die MAX_PATH limitierung zum tragen :shock:

Ein work-a-round mit takeown /d y /r /a /f \\?\c:\windows\csc geht nicht, weil: FEHLER: Die Datei oder das Verzeichnis wurde nicht gefunden.

Nun könnte man es ganz umständlich noch hinbiegen und ein Teilpfad woanders einfügen, siehe: https://serverfault.com/a/654756
Aber das ist mir zu mühsam...



Aber ist schon geil, wie man seine Platte schön mit Dateileichen zumüllen kann...
Denke mal ich werde irgendwann ein Linux von USB Stick starten und dann löschen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Am besten gleich das ganze Windows und dann Linux installieren. ;-)

Oder sei einfach froh das es immerhin die 8.3-Namenseinschränkungen von DOS nicht mehr gibt und Festplattenplatz heutzutage reichlich und günstig ist. :-D
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:@jens: Am besten gleich das ganze Windows und dann Linux installieren. ;-)
Da wäre ich sofort bereit zu... geht aber beruflich nicht :evil:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:Festplattenplatz heutzutage reichlich und günstig ist. :-D
Trifft aber nicht zu, wenn C: eine SSD ist. Deswegen hab ich den CSC Pfad ja auch umbiegen wollen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So ein Mist... Nun hab ich auch das Problem mit PyHardLinkBackup...

z.B. beim schreiben der hast Datei... Der Pfad wird ja eh schon verlängert durch den "prefix" wie "d:\PyHardLinkBackups\Dokumente\2016-02-03-170212\" und dann hinten noch ein ".sha512" dran...

Also konsequenterweise sollte ich alle Pfade pauschal mit dem prefix \\?\ versehen...
Und da kommen wir wieder zurück zum anderen Problem: "Wie am schönsten pathlib.Path erweitern?!?" -> viewtopic.php?f=1&t=37909

Denn es wäre ja wunderbar, wenn generell pathlib.Path() unter Windows den prefix \\?\ einfügen könnte...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Das es mit dem Langpräfix \\?\ trotzdem bei den kurzen Pfadlängen bleibt, ist schon ärgerlich. Evtl. ist es sinnvoll mal zu schauen, wie CPython unter Windows gelinkt wird und ob es relativ einfach auf die lange Version erweiterbar wäre (leider wird die Langnotation selbst von Windows bzw. WinAPI-Calls nicht vollständig unterstützt). Falls es dazu nichts im Python Bugtracker gibt, hat es vermutlich bisher noch niemand gebraucht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab mal gesucht und mehrere Tickets gefunden: https://bugs.python.org/issue?%40column ... C1%2C2%2C3

In https://bugs.python.org/issue542314 steckt der Tip, einfach mit relativen Pfaden zu arbeiten! Das ist schon mal eine Idee, wenn auch nicht immer machbar bzw. hilft nicht in allen Situationen...

Interessant ist das offene Ticket hier: https://bugs.python.org/issue18199
Aktuelles Fazit darin: Windows API ist mist und man sollte \\?\ selbst hinzufügen, wenn man es braucht. Aber das löst ja nicht das Problem: Denn auch damit kommt man ja nicht weit.

Hab ich oben einen Fehler, beim Testen mit \\?\ ?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also das mit den Relativen Pfaden scheind blödsinn zu sein:

Code: Alles auswählen

import os
import tempfile

with tempfile.TemporaryDirectory(prefix="path_test_") as path:
    os.chdir(path)

    def go_deeper():
        try:
            os.mkdir("12345678")
            os.chdir("12345678")
        except FileNotFoundError as err:
            print("*** %s" % err)
            return

        cwd = os.getcwd()
        print(len(cwd), cwd)
        go_deeper()

    go_deeper()

    filename=""
    for no in range(30):
        filename+="X"
        try:
            open(filename, "w")
        except FileNotFoundError as err:
            print("+++ %s" % err)
            break

        filepath = os.path.join(os.getcwd(), filename)
        print(len(filepath), filepath)
Ausgabe (gekürzt):
60 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678
69 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678
78 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678
87 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678
96 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678
105 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678
114 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678
123 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
132 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
141 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
150 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
159 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
168 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
177 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
186 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
195 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
204 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
213 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
222 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
231 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
240 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678
*** [WinError 206] Der Dateiname oder die Erweiterung ist zu lang: '12345678'
242 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\X
243 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XX
244 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXX
245 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXX
246 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXX
247 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXX
248 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXX
249 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXX
250 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXX
251 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXX
252 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXX
253 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXX
254 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXX
255 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXXX
256 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXXXX
257 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXXXXX
258 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXXXXXX
259 C:\Users\jens\AppData\Local\Temp\path_test_887yk2ps\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\12345678\XXXXXXXXXXXXXXXXXX
+++ [Errno 2] No such file or directory: 'XXXXXXXXXXXXXXXXXXX'
Traceback (most recent call last):
File "d:\test.py", line 35, in <module>
print(len(filepath), filepath)
File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 807, in __exit__
self.cleanup()
File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 811, in cleanup
_shutil.rmtree(self.name)
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 488, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 378, in _rmtree_unsafe
_rmtree_unsafe(fullname, onerror)
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 378, in _rmtree_unsafe
...
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 378, in _rmtree_unsafe
_rmtree_unsafe(fullname, onerror)
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 387, in _rmtree_unsafe
onerror(os.rmdir, path, sys.exc_info())
File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 385, in _rmtree_unsafe
os.rmdir(path)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_887yk2ps\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678\\12345678'
Auch kann ich effektiv nur Pfade mit eine Länge von 259 Zeichen bearbeiten...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Aha! Hab entdeckt, das mein Test Skript doch nicht so ganz richtig ist!

Denn: Man kann mit os.mkdir("\\\\?\\%s" % new_path) auf Verzeichnisse erzeugen, die länger sind. Aber man kann sie mit os.chdir("\\\\?\\%s" % new_path) nicht betreten!

Aber es geht doch eine ganze Menge damit:

Code: Alles auswählen

import os
import pathlib
import tempfile

def test(func, *args):
    try:
        func(*args)
    except OSError as err:
        print("%s: %s" % (func.__name__, err))
    else:
        print("%s, ok" % func.__name__)


with tempfile.TemporaryDirectory(prefix="path_test_") as path:
    new_path = pathlib.Path(path, "A"*255, "B"*255)

    print(len(str(new_path)), new_path)

    extended_path = "\\\\?\\%s" % new_path
    print(len(extended_path), extended_path)
    path_instance = pathlib.Path(extended_path)

    print("\n *** works with \\?\ notation:")
    test(os.makedirs, extended_path)
    test(os.path.isdir, extended_path)
    test(open, "%s\\A" % extended_path, "w")
    test(os.path.isfile, "%s\\A" % extended_path)
    test(os.link, "%s\\A" % extended_path, "%s\\B" % extended_path)
    test(os.unlink, "%s\\A" % extended_path)

    print("\n *** pathlib tests:")
    test(path_instance.resolve)
    test(path_instance.is_dir)
    pathlib_filepath = pathlib.Path(path_instance, "C")
    test(pathlib_filepath.open, "w")

    print("\n *** Doesn't working with \\?\ notation:")
    test(os.chdir, extended_path)

    print("="*79)
    print("="*79)
Ausgabe:

Code: Alles auswählen

563 C:\Users\jens\AppData\Local\Temp\path_test_rsdf1li0\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
567 \\?\C:\Users\jens\AppData\Local\Temp\path_test_rsdf1li0\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

 *** works with \?\ notation:
makedirs, ok
_isdir, ok
open, ok
isfile, ok
link, ok
unlink, ok

 *** pathlib tests:
resolve, ok
is_dir, ok
open, ok

 *** Doesn't working with \?\ notation:
chdir: [WinError 206] Der Dateiname oder die Erweiterung ist zu lang: '\\\\?\\C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_rsdf1li0\\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
===============================================================================
===============================================================================
Traceback (most recent call last):
  File "d:\test.py", line 41, in <module>
    print("="*79)
  File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 807, in __exit__
    self.cleanup()
  File "C:\Program Files (x86)\Python35-32\lib\tempfile.py", line 811, in cleanup
    _shutil.rmtree(self.name)
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 488, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 383, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Program Files (x86)\Python35-32\lib\shutil.py", line 381, in _rmtree_unsafe
    os.unlink(fullname)
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'C:\\Users\\jens\\AppData\\Local\\Temp\\path_test_rsdf1li0\\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, mit https://github.com/jedie/PyHardLinkBack ... 4a946a9a7a nutzte ich jetzt "intern" immer \\?\ als Pfad Prefix unter Windows. Damit hat dich das Problem erledigt und PyHardLinkBackup kann nun auch sehr lange Pfade sichern :D

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten