JSA里的ffi(14)——跨盘符剪切移动文件夹

wils
wils

创作者俱乐部成员

祝大家新春快乐!

今天论坛上有朋友问JSA里如何跨盘符移动文件夹

过去分享过movefilea方法https://bbs.wps.cn/topic/47851

现在有了ffi

用SHFileOperationW更方便,且可以跨盘符,并支持特殊unicode字符

function aa()
{
    const {SHFileOperationW} = ffi.LoadLibrary("shell32",{
        SHFileOperationW: { returnType: "int32", parameters: ["pointer"]},
    })
    const _SHFILEOPSTRUCTW = ffi.Struct([
        {name: "hwnd", type: "pointer"},
        {name: "wFunc", type: "uint32"},
        {name: "pFrom", type: "u16string"},
        {name: "pTo", type: "u16string"},
        {name: "fFlags", type: "uint32"},
        {name: "fAnyOperationsAborted", type: "int32"},
        {name: "hNameMappings", type: "pointer"},
        {name: "lpszProgressTitle", type: "pointer"},
    ])
    const mv = new _SHFILEOPSTRUCTW({
        hwnd: null,
        wFunc: 1,
        pFrom: "C:\\新建文件夹\0",
        pTo: "D:\\\0",
        fFlags: 0x0010 | 0x0400 | 0x0004,
        fAnyOperationsAborted: 0,
        hNameMappings: null,
        lpszProgressTitle: null,
    })
    console.log(SHFileOperationW(mv))
}

这里有个问题,pFrom pTo这里的文件路径需要以\0分隔,且必须以两个\0结尾

但好像u16string传递时会自动在结尾加一个\0,所以这里我只手动加了一个\0

这样做是否标准,希望大佬指正

海南省
浏览 66
2
3
分享
3 +1
9
2 +1
全部评论 9
 
恰同学少年
Shell(`CMD /k ROBOCOPY ${ThisWorkbook.Path}\\新建文件夹 E:\\新建文件夹 /E /MOVE ` ,jsHide); 从代码量,这个就一行。ffi优势还得研究。
· 黑龙江省
1
回复
wils
wils

创作者俱乐部成员

嘿嘿,比如ffi这个移动可以右键撤销,算是个小小的优势
· 海南省
回复
 
恰同学少年
ffi代码量也太多了点。不知道和ExecuteExcel4Macro区别有哪些
· 黑龙江省
1
回复
wils
wils

创作者俱乐部成员

非要说ffi的优势,大概movefilea这种a结尾的方法的不能处理特殊的文件名 用executeexcel4macro调用w结尾的方法,代码量则会更多一点 然后就是word里没有这个方法吧
· 海南省
回复
 
恰同学少年
跨盘移动也可以 MoveFileExA
· 黑龙江省
1
回复