17

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

4

3 に答える 3

26

255文字の制限についてはよくわからなかったので、この投稿に出くわしました。そこで私は実用的な答えを見つけました:パスの前に\\?\を追加します。

shutil.copyfile("\\\\?\\" + copy_file, dest_file)

編集:長いパスを使用すると、Windowsで問題が発生することがわかりました。私が使用するもう1つのトリックは、パスを短くすることです。

import win32api
path = win32api.GetShortPathName(path)
于 2012-12-28T21:41:46.120 に答える
6

答え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
于 2014-01-16T16:58:12.120 に答える
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文字を超える場合は、同じボートに戻ります。その場合、ファイルを数回移動する必要があります。

于 2012-12-28T20:41:34.100 に答える