簡體   English   中英

Windows上的python長路徑 - os.stat()失敗了相對路徑?

[英]Long paths for python on windows - os.stat() fails for relative paths?

我想在Windows上訪問一些長UNC路徑。 我知道我需要使用"\\\\?\\UNC\\"前綴(如果你轉義斜杠,則為"\\\\\\\\?\\\\UNC\\\\" )。 這工作正常:

os.stat('\\\\?\\UNC\\server.example.com\\that\\has\\long\\path\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt')
# works, returns os.stat_result

但是,它似乎失敗了一個相對路徑:

os.chdir('\\\\?\\UNC\\server.example.com\\that\\has\\long\\path')
os.getcwd()
# returns '\\\\?\\UNC\\server.example.com\\that\\has\\long\\path'
os.stat('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt')
# fails with [WinError 3] The system cannot find the path specified: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt'

這可能是Python中的一個錯誤,還是我的代碼錯了?

旁注 - 解決方法是os.stat(os.path.abspath('aaa\\\\bbb.txt'))

在Windows 10中,您可以通過在“HKLM \\ System \\ CurrentControlSet \\ Control \\ FileSystem”中設置名為“LongPathsEnabled”的DWORD來為系統啟用長路徑支持。 這允許聲明支持其清單中的長路徑的應用程序使用內核支持的最大路徑長度(大約32,760個字符,具體取決於最終解析的路徑),甚至不需要“\\\\?\\”前綴。 Python 3.6+表現為支持長路徑。

也就是說,在Windows 10之前,工作目錄和相對路徑不能超過MAX_PATH (260)個字符,其中包括尾部反斜杠和NUL終止符。 目前的文件在這一點上具有誤導性。 顯然有人將免責聲明“將此限制擴展到32,767個寬字符......”添加到SetCurrentDirectory的文檔中。 不,沒有延長限制。 這就是2016年左右所說的內容。

進程的當前工作目錄是DOS路徑,而不是本機內核路徑(*)。 DOS路徑是任何非Unicode的路徑,或使用正斜杠,DOS設備(例如邏輯驅動器號,CON,NUL等)或UNC語法。 必須通過ntdll.dll中的運行時庫函數將DOS路徑轉換為本機路徑。 如果長路徑支持不可用,則此隱式轉換限制為最多MAX_PATH字符。

解決此問題需要使用以“\\\\?\\”前綴開頭的完全限定的Unicode路徑。 此前綴告訴運行時庫繞過路徑轉換。 相反,它只是將“\\\\?\\”前綴替換為DOS設備鏈接的內核“\\ ?? \\”虛擬目錄,並且路徑最終解析為真正的NT設備(例如“\\\\?\\ UNC”=>“ \\ ?? \\ UNC“=>”\\ Device \\ Mup“)。


(*)內核命名空間對所有內核對象使用單根樹,而不僅僅是設備對象。 它還有一種更可靠的處理相對路徑的方法; 請參閱OBJECT_ATTRIBUTESRootDirectory字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM