我编写Python脚本来复制文件;不幸的是,由于文件名太长(> 256),它一直失败。无论如何要处理这个问题吗?
我正在使用Python 2.5.4和Windows XP。
干杯,
答案 0 :(得分:10)
答案 1 :(得分:9)
为了使用\\?\
前缀(如已经提出的那样),您还需要确保使用Unicode字符串作为文件名,而不是常规(字节)字符串。
答案 2 :(得分:1)
您是否尝试过this旧帖子exp中建议的解决方法。 “魔术前缀”技巧?我不知道底层问题(我们没有使用许多可用的Windows API文件中的正确版本)得到修复,但解决方法应该有效...
答案 3 :(得分:1)
对于其他寻求解决方案的人:
\\?\
,如前所述,并确保字符串为unicode; 你必须写下这样的话:
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)
# 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")