Python在Windows上支持长文件名的功能出现故障

13

我编写了一个Python脚本以复制文件;不幸的是,由于文件名太长(>256),它一直失败。有没有办法解决这个问题?

我正在使用Python 2.5.4和Windows XP。

谢谢!

5个回答

13

为了跟进这个答案,不要简单地在你的路径中添加"\?",而是要添加"\\?\"来转义所需的反斜杠。 - Be Chiller Too

9
为了使用已经提出的\\?\前缀,您还需要确保使用Unicode字符串作为文件名,而不是常规(字节)字符串。

3
我发现只有绝对路径名称可行(1),而且只有反斜杠可用(2)。 - Evgeni Sergeev

4

如果有其他人在寻找解决方案:

  1. 你需要添加前缀\\?\,并确保字符串是unicode格式;
  2. 如果你正在使用shutil,特别是类似于shutil.rmtree的onerror方法,你也需要修改它以添加前缀,因为它会在某个地方被剥离。

你需要编写类似以下的内容:

def remove_dir(directory):
    long_directory = '\\\\?\\' + directory
    shutil.rmtree(long_directory, onerror=remove_readonly)

def remove_readonly(func, path, excinfo):
    long_path = path
    if os.sep == '\\' and '\\\\?\\' not in long_path:
        long_path = '\\\\?\\' + long_path
    os.chmod(long_path, stat.S_IWRITE)
    func(long_path)

这是一个 Python 3.x 的示例,因此所有字符串都是 unicode。


0

uDev的这个回答建议添加

# Fix long path access:
import ntpath
ntpath.realpath = ntpath.abspath

对我来说似乎可以工作。


0
另一件对我有效的事情是改变目录到我想要复制的位置。
import os
import shutil

def copyfile_long_path(src, dst):
    
    src_abs = os.path.abspath(src)
    dst_abs = os.path.abspath(dst)
    
    cwd = os.getcwd()
    os.chdir(os.path.dirname(dst))
    shutil.copyfile(src_abs, os.path.filename(dst))
    os.chdir(cwd)
    
    if not os.path.isfile(dst_abs):    
        raise Exception("copying file failed")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接