10

現在、多数の画像ファイルとフォルダーをコピーするために使用shutil.copy2()しています(0.5〜5ギガの間のどこでも)。 Shutilうまく動作しますが、とても遅いです。この情報を Windows に渡してコピーを作成し、標準の転送ダイアログ ボックスを表示する方法があるかどうか疑問に思っています。ほら、この男…

http://www.top-windows-tutorials.com/images/file-copy.jpg

多くの場合、私のスクリプトは、標準的な Windows のコピーにかかる時間の約 2 倍かかります。また、コピーの実行中に Python インタープリターがハングするのではないかと不安になります。コピープロセスを複数回実行していますが、時間を短縮したいと考えています。

4

4 に答える 4

5

あなたの目標が凝ったコピー ダイアログであれば、SHFileOperation Windows API 関数がそれを提供します。pywin32 パッケージには python バインディングがあり、ctypes もオプションです (たとえば、google "SHFileOperation ctypes")。

pywin32 を使用した私の (非常に軽くテストされた) 例を次に示します。

import os.path
from win32com.shell import shell, shellcon


def win32_shellcopy(src, dest):
    """
    Copy files and directories using Windows shell.

    :param src: Path or a list of paths to copy. Filename portion of a path
                (but not directory portion) can contain wildcards ``*`` and
                ``?``.
    :param dst: destination directory.
    :returns: ``True`` if the operation completed successfully,
              ``False`` if it was aborted by user (completed partially).
    :raises: ``WindowsError`` if anything went wrong. Typically, when source
             file was not found.

    .. seealso:
        `SHFileperation on MSDN <http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx>`
    """
    if isinstance(src, basestring):  # in Py3 replace basestring with str
        src = os.path.abspath(src)
    else:  # iterable
        src = '\0'.join(os.path.abspath(path) for path in src)

    result, aborted = shell.SHFileOperation((
        0,
        shellcon.FO_COPY,
        src,
        os.path.abspath(dest),
        shellcon.FOF_NOCONFIRMMKDIR,  # flags
        None,
        None))

    if not aborted and result != 0:
        # Note: raising a WindowsError with correct error code is quite
        # difficult due to SHFileOperation historical idiosyncrasies.
        # Therefore we simply pass a message.
        raise WindowsError('SHFileOperation failed: 0x%08x' % result)

    return not aborted

上記のフラグを「詳細については、 SHFILEOPSTRUCTshellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR.を参照してください」に設定すると、「サイレント モード」(ダイアログなし、確認メッセージなし、エラー ポップアップなし) で同じコピー操作を実行することもできます。

于 2013-06-01T09:18:25.357 に答える