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:

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