Копирование с использованием диалогового окна копирования Windows

В настоящее время я использую shutil.copy2() для копирования большого количества файлов и папок изображений (где-то между 0,5 и 5 гигабайтами). Shutil прекрасно работает, но он настолько медленный. Мне интересно, есть ли способ передать эту информацию в Windows, чтобы сделать копию и предоставить мне стандартное диалоговое окно передачи. Знаешь, этот парень …

http://www.top-windows-tutorials.comhttp://img.rupython.com/pythonfile-copy.jpg

Много раз мой сценарий будет занимать примерно в два раза больше времени, затрачиваемого стандартными окнами, и это заставляет меня нервничать, когда мой интерпретатор python зависает во время запуска копии. Я запускаю процесс копирования несколько раз, и я ищу, чтобы сократить время.

3 Solutions collect form web for “Копирование с использованием диалогового окна копирования Windows”

Если ваша цель – это причудливое диалоговое окно копирования, функция SHFileOperation Windows API обеспечивает это. Пакет pywin32 имеет привязку к python для этого, ctypes также является опцией (например, для «SHFileOperation ctypes» для Google).

Вот мой (очень слегка испытанный) пример с использованием 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 

Вы также можете выполнить одну и ту же операцию копирования в «бесшумном режиме» (без диалога, никаких подтвержденийm, всплывающих окон с ошибкой), если вы установите флаги выше на shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR. shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR. Подробнее см. SHFILEOPSTRUCT .

См. IFileCopy . IFileOperation может быть доступен через ctypes и shell32.dll, я не уверен.

Обновление: см.

Было бы неплохо, если бы оно было завернуто в библиотеку … С помощью приведенных выше ответов я смог заставить его работать над окнами 7 следующим образом.

 import pythoncom from win32com.shell import shell,shellcon def win_copy_files(src_files,dst_folder): # @see IFileOperation pfo = pythoncom.CoCreateInstance(shell.CLSID_FileOperation,None,pythoncom.CLSCTX_ALL,shell.IID_IFileOperation) # Respond with Yes to All for any dialog # @see http://msdn.microsoft.com/en-us/library/bb775799(v=vs.85).aspx pfo.SetOperationFlags(shellcon.FOF_NOCONFIRMATION) # Set the destionation folder dst = shell.SHCreateItemFromParsingName(dst_folder,None,shell.IID_IShellItem) for f in src_files: src = shell.SHCreateItemFromParsingName(f,None,shell.IID_IShellItem) pfo.CopyItem(src,dst) # Schedule an operation to be performed # @see http://msdn.microsoft.com/en-us/library/bb775780(v=vs.85).aspx success = pfo.PerformOperations() # @see sdn.microsoft.com/en-us/library/bb775769(v=vs.85).aspx aborted = pfo.GetAnyOperationsAborted() return success and not aborted files_to_copy = [r'C:\Users\jrm\Documents\test1.txt',r'C:\Users\jrm\Documents\test2.txt'] dest_folder = r'C:\Users\jrm\Documents\dst' win_copy_files(files_to_copy,dest_folder) 

Ссылки здесь также были очень полезны: http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartClientCom.html

  • Автоматическое создание папок хоста, отличных от c: \ Users в изображениях Docker в Windows
  • Сценарий python, который активирует virtualenv, а затем запускает другой скрипт python?
  • tkinter.TclError: изображения "pyimage3" не существует
  • virtualenv на windows устанавливается в пакеты системных сайтов
  • python вызывает внешние программы без открытия консоли (dos prompt)
  • Как я могу извлечь граф вызовов функции из исходных файлов Python?
  • Как использовать цвет в командной строке Windows с помощью Python?
  • Python 3.4 многопроцессорная очередь быстрее, чем Pipe, неожиданно
  • сохранить несколько окон консоли из пакета
  • ImportError: Ошибка загрузки DLL при импорте win32clipboard в приложение, замороженное cx_Freeze
  • Программа Python работает в IDLE, но не в командной строке
  • Python - лучший язык программирования в мире.