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 \\?\ ?!?
NTFS: Pfadlänge max. 259 Zeichen...
- 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:
Ausgabe (gekürzt):
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)
Auch kann ich effektiv nur Pfade mit eine Länge von 259 Zeichen bearbeiten...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'
- 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:
Ausgabe:
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)
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'
- 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