为了账号安全,请及时绑定邮箱和手机立即绑定

使用Windows复制对话框复制

使用Windows复制对话框复制

白猪掌柜的 2021-03-12 15:04:35
我目前正在shutil.copy2()复制大量的图像文件和文件夹(介于0.5和5个演出之间的任何位置)。 Shutil效果很好,但是太慢了。我想知道是否有一种方法可以将此信息传递给Windows进行复制并提供其标准传输对话框。你知道,这个家伙很多时候,我的脚本所花费的时间大约是标准Windows副本所用时间的两倍,这让我感到紧张,因为我的python解释器在运行副本时会挂起。我多次运行复制过程,因此希望减少时间。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

*碰撞* Windows 10!


在您的所有帮助下,以及Virgil Dupras的send2trash:

我只使用以下方法制作了香草Python版本ctypes:


import os

import ctypes

from ctypes import wintypes



class _SHFILEOPSTRUCTW(ctypes.Structure):

    _fields_ = [("hwnd", wintypes.HWND),

                ("wFunc", wintypes.UINT),

                ("pFrom", wintypes.LPCWSTR),

                ("pTo", wintypes.LPCWSTR),

                ("fFlags", ctypes.c_uint),

                ("fAnyOperationsAborted", wintypes.BOOL),

                ("hNameMappings", ctypes.c_uint),

                ("lpszProgressTitle", wintypes.LPCWSTR)]



def win_shell_copy(src, dst):

    """

    :param str src: Source path to copy from. Must exist!

    :param str dst: Destination path to copy to. Will be created on demand.

    :return: Success of the operation. False means is was aborted!

    :rtype: bool

    """

    if not os.path.exist(src):

        print('No such source "%s"' % src)

        return False


    src_buffer = ctypes.create_unicode_buffer(src, len(src) + 2)

    dst_buffer = ctypes.create_unicode_buffer(dst, len(dst) + 2)


    fileop = _SHFILEOPSTRUCTW()

    fileop.hwnd = 0

    fileop.wFunc = 2  # FO_COPY

    fileop.pFrom = wintypes.LPCWSTR(ctypes.addressof(src_buffer))

    fileop.pTo = wintypes.LPCWSTR(ctypes.addressof(dst_buffer))

    fileop.fFlags = 512  # FOF_NOCONFIRMMKDIR

    fileop.fAnyOperationsAborted = 0

    fileop.hNameMappings = 0

    fileop.lpszProgressTitle = None


    result = ctypes.windll.shell32.SHFileOperationW(ctypes.byref(fileop))

    return not result

✔在src和dst路径较长的Python 3.7和2.7上进行了测试。


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 372 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信