我正在尝试使用Python 2.7在Windows上复制文件,但有时会失败。
shutil.copyfile(copy_file, dest_file)
我得到以下IOError:
[Errno 2] No such file or directory
但文件确实存在!问题是文件的路径太长。 (> 255个字符)
如何复制这些文件?在其他应用程序中打开它们不是问题。
要创建路径太长的文件,请创建一个文件名尽可能长的文件,然后将包含的文件夹向下移动到树形结构中。
我一直在尝试其中一些方法但没有成功: http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
答案 0 :(得分:18)
我不确定255个字符限制所以我偶然发现this post。在那里我找到了一个有效的答案:在路径前添加\\?\。
shutil.copyfile("\\\\?\\" + copy_file, dest_file)
编辑: 我发现使用长路径会导致Windows出现问题。我使用的另一个技巧是缩短路径:
import win32api
path = win32api.GetShortPathName(path)
答案 1 :(得分:5)
感谢您的回答Gfy。我需要使用相对路径。 \\?\
无法成功添加到相对路径,因此必须先转换为绝对路径(从桌面运行):
import os
def clean_path(path):
path = path.replace('/',os.sep).replace('\\',os.sep)
if os.sep == '\\' and '\\\\?\\' not in path:
# fix for Windows 260 char limit
relative_levels = len([directory for directory in path.split(os.sep) if directory == '..'])
cwd = [directory for directory in os.getcwd().split(os.sep)] if ':' not in path else []
path = '\\\\?\\' + os.sep.join(cwd[:len(cwd)-relative_levels]\
+ [directory for directory in path.split(os.sep) if directory!=''][relative_levels:])
return path
clean_path('samples')
\\?\C:\Users\Username\Desktop\samples
clean_path('\samples')
\\?\C:\Users\Username\Desktop\samples
clean_path('..\samples')
\\?\C:\Users\Username\samples
clean_path('..\..\samples')
\\?\C:\Users\samples
clean_path('C:\Users\Username\Dropbox')
\\?\C:\Users\Username\Dropbox
答案 2 :(得分:0)
也许做这样的事情:
path = "some/really/really/long/path/more/than/255/chars.txt"
def copyFile(path, dest, relative=0):
if len(path) > 255:
if not os.sep in path:
raise SomeException()
moveTo, path = path.split(os.sep, 1)
os.chdir(moveTo)
copyFile(path, dest, relative + 1)
else:
path_base = ['..'] * relative
path_rel = path_base + [dest]
shutil.copyfile(path, os.path.join(*path_rel))
这已经过测试,确实有效......但是,如果目的地超过255个字符,您将回到同一条船上。在这种情况下,您可能需要多次移动文件。