13

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

我正在使用 Python 2.5.4 和 Windows XP。

干杯,

4

6 回答 6

13

使用以字符串开头的路径\\?\

于 2009-09-02T04:19:51.120 回答
9

为了使用\\?\前缀(如前所述),您还需要确保使用 Unicode 字符串作为文件名,而不是常规(字节)字符串。

于 2009-09-02T04:25:06.053 回答
3

对于其他在这里寻找解决方案的人:

  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。

于 2018-06-19T09:24:27.020 回答
1

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

于 2009-09-02T04:23:01.783 回答
0

uDev的这个答案建议添加

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

它似乎对我有用。

于 2020-12-10T19:30:49.787 回答
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")
于 2020-12-10T19:35:48.330 回答