WindowsError:[错误3]系统找不到指定的路径(当路径太长时?)
我正在创建一个脚本来查找两个目录之间的唯一文件。为了做到这一点,我使用os.walk()
来遍历文件,如果存在相同大小的文件,我将它们哈希以确保它们是相同的(在此过程中打开文件)。问题是某些文件在打开时会产生上述错误。人们遇到此问题的最常见原因是因为路径未正确连接,从而导致脚本尝试打开不存在的文件。对我来说情况并非如此。
尝试不同的目录组合后,我开始注意到一种模式,即产生错误的文件似乎具有深层目录结构和长文件名。我想不出这个问题的任何其他原因 - 没有字符编码错误(我将所有路径解码为UTF-8),并且路径确实存在os.walk()
。
我的行走代码:
for root, dirs, files in os.walk(directory):
for filename in files:
file_path = os.path.join(root, filename)
我的哈希码:
def hash(file_path):
with open(dir_file, 'rb') as f:
hasher = hashlib.md5()
while True:
buf = f.read(byte_size)
if buf != '':
hasher.update(buf)
else:
break
result = hasher.hexdigest()
return result
编辑:问题出现的最新路径是5个目录深(包含142个字符,占双反斜杠),文件名是另外122个字符长
答案 0 :(得分:1)
这是由于MSDN上解释的Windows API文件路径大小限制:
在Windows API中(以下段落中讨论了一些例外),路径的最大长度为MAX_PATH,,定义为260个字符。本地路径按以下顺序构成:驱动器号,冒号,反斜杠,由反斜杠分隔的名称组件以及终止空字符。例如,驱动器D上的最大路径是“D:\某个256个字符的路径字符串”,其中“”表示当前系统代码页的不可见的终止空字符。 (字符<>在此处用于视觉清晰度,不能是有效路径字符串的一部分。)
正如在该页面上所解释的那样,较新版本的Windows支持用于Unicode路径等的扩展文件路径前缀(\\?\
),但这不是一致或保证的行为,即它并不意味着它将起作用在所有情况下。
无论哪种方式,尝试使用扩展路径前缀添加路径,看看它是否适合您的情况:
file_path = "\\\\?\\" + os.path.join(root, filename)