我使用以下代码在windows上执行一些文件系统操作(复制/移动/重命名文件和文件夹)。
此代码需要pywin32。

from win32com.shell import shell, shellcon
from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL, WORD
from ctypes import c_void_p, Structure, windll, POINTER, byref

src = unicode(os.path.abspath(_src_) + '\0', 'utf-8')
dest = unicode(os.path.abspath(_dest_) + '\0', 'utf-8')

class SHFILEOPSTRUCTW(Structure):
    _fields_ = [("hwnd", HWND),
                ("wFunc", UINT),
                ("pFrom", LPCWSTR),
                ("pTo", LPCWSTR),
                ("fFlags", WORD),
                ("fAnyOperationsAborted", BOOL),
                ("hNameMappings", c_void_p),
                ("lpszProgressTitle", LPCWSTR)]

SHFileOperationW = windll.shell32.SHFileOperationW
SHFileOperationW.argtypes = [POINTER(SHFILEOPSTRUCTW)]

args = SHFILEOPSTRUCTW(wFunc=UINT(op), pFrom=LPCWSTR(src), pTo=LPCWSTR(dest), fFlags=WORD(flags), fAnyOperationsAborted=BOOL())

result = SHFileOperationW(byref(args))
aborted = bool(args.fAnyOperationsAborted)

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('SHFileOperationW failed: 0x%08x' % result)

标志总是:shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR
op用于例如:shellcon.FO_COPY
我遇到的问题是,有时这个函数会给我错误:
ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_SHFILEOPSTRUCTW instance instead of pointer to SHFILEOPSTRUCTW

尤其是在处理非常长的路径时(例如len(dest)=230
我做错什么了?
[编辑]
有一个shell.SHFileOperation但是我们需要使用自定义包装器SHFileOperationW来支持unicodes。
[编辑2]
正如Barmak Shemirani所写,在python3中,您只需使用shell.SHFileOperation,它就可以处理任何特殊的unicode字符。
如果我能在python2中找到解决方案,我将在这里分享它。

最佳答案

在版本3中,您可以将shell.SHFileOperationSHFILEOPSTRUCT一起使用,这也将在需要时附加双空终止符。

from win32com.shell import shell, shellcon

shell.SHFileOperation((
    None,
    shellcon.FO_COPY,
    "c:\\test\\test1.txt\0c:\\test\\test2.txt",
    "c:\\test\\ελληνική+漢語+English",
    shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION |
    shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR,
    None,
    None))

关于python - 预期的LP_SHFILEOPSTRUCTW实例,而不是指向SHFILEOPSTRUCTW的指针(python ctypes),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48448611/

10-11 05:12