Windows中断了Python长文件名支持

时间:2009-09-02 04:15:52

标签: python windows python-2.x

我编写Python脚本来复制文件;不幸的是,由于文件名太长(> 256),它一直失败。无论如何要处理这个问题吗?

我正在使用Python 2.5.4和Windows XP。

干杯,

6 个答案:

答案 0 :(得分:10)

答案 1 :(得分:9)

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

答案 2 :(得分:1)

您是否尝试过this旧帖子exp中建议的解决方法。 “魔术前缀”技巧?我不知道底层问题(我们没有使用许多可用的Windows API文件中的正确版本)得到修复,但解决方法应该有效...

答案 3 :(得分:1)

对于其他寻求解决方案的人:

  1. 您需要添加前缀\\?\,如前所述,并确保字符串为unicode;
  2. 如果你正在使用shutil,特别是shutil.rmtree和onerror方法之类的东西,你也需要修改它以添加前缀,因为它在途中被剥离了。
  3. 你必须写下这样的话:

    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。

答案 4 :(得分:0)

This answer by uDev建议添加

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

这似乎对我有用。

答案 5 :(得分: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")