将具有太长路径的文件复制到Python中的另一个目录

Gfy*_*Gfy 12 python copy

我试图用Windows 2.7在Windows上复制文件,但有时这会失败.

shutil.copyfile(copy_file, dest_file)
Run Code Online (Sandbox Code Playgroud)

我得到以下IOError:

[Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

但该文件确实存在!问题是文件的路径太长.(> 255个字符)

我如何复制这些文件?在其他应用程序中打开它们不是问题.

要创建路径太长的文件,请创建一个具有尽可能长的文件名的文件,并将包含的文件夹向下移动到树结构中.

我一直在尝试其中一些方法但没有成功:http: //timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

Gfy*_*Gfy 18

我不确定255限制,所以我偶然发现了这篇文章.在那里我找到了一个有效的答案:在路径前添加\\?\.

shutil.copyfile("\\\\?\\" + copy_file, dest_file)
Run Code Online (Sandbox Code Playgroud)

编辑:我发现使用长路径会导致Windows出现问题.我使用的另一个技巧是缩短路径:

import win32api
path = win32api.GetShortPathName(path)
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)