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

soo*_*kie 5 python-2.7

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)
Run Code Online (Sandbox Code Playgroud)

我的哈希码:

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
Run Code Online (Sandbox Code Playgroud)

编辑:出现问题的最新路径是 5 个目录深(包含 142 个字符,占双反斜杠),文件名还有 122 个字符长

zwe*_*wer 4

这是由于 Windows API 文件路径大小限制,如MSDN上所述:

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

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

无论哪种方式,请尝试在您的路径前面加上扩展路径前缀,看看它是否适合您的情况:

file_path = "\\\\?\\" + os.path.join(root, filename)
Run Code Online (Sandbox Code Playgroud)