繁体   English   中英

WindowsError:[错误3]系统找不到指定的路径(当路径太长?)

[英]WindowsError: [Error 3] The system cannot find the path specified (when path too long?)

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个字符长

这是由于MSDN上解释的Windows API文件路径大小限制:

在Windows API中(以下段落中讨论了一些例外),路径的最大长度为MAX_PATH, 定义为260个字符 本地路径按以下顺序构成:驱动器号,冒号,反斜杠,由反斜杠分隔的名称组件以及终止空字符。 例如,驱动器D上的最大路径是“D:\\某个256个字符的路径字符串”,其中“”表示当前系统代码页的不可见的终止空字符。 (这里使用字符<>是为了清晰,不能成为有效路径字符串的一部分。)

正如在该页面上所解释的,较新版本的Windows支持用于Unicode路径等的扩展文件路径前缀( \\\\?\\ ),但这不是一致或保证的行为,即它并不意味着它将在所有情况下都有效。

无论哪种方式,尝试使用扩展路径前缀预先添加路径,看看它是否适用于您的情况:

file_path = "\\\\?\\" + os.path.join(root, filename)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM