找回密码
 加入
搜索
查看: 7169|回复: 11

[AU3基础] [已解决] 请看看这段复制文件的代码,为何不支持中文名称,路径?

  [复制链接]
发表于 2012-6-3 14:48:47 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2012-6-4 20:23 编辑

感谢 happytc  帮助修改,问题解决!修改后的代码在 6 楼!

从一老外的脚本中提取,仅对英文路径,名称有效。下面代码可以在 SciTE 中直接运行!
望哪位高手能修改为支持中文名称,路径!谢谢!!!
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global Const $FO_COPY = 0x0002
Global Const $FOF_SIMPLEPROGRESS = 0x0100
Global Const $FOF_NOCONFIRMATION = 0x0010
Global $Offenes_Projekt = "", $msg

$GUI = GUICreate("My GUI", 300, 80)

$Button_1 = GUICtrlCreateButton("复制文件", 160, 30, 100)
$Button_2 = GUICtrlCreateButton("复制文件夹", 20, 30, 100)

GUISetState(@SW_SHOW)

While 1
        $msg = GUIGetMsg()
        Select
                Case $msg = $GUI_EVENT_CLOSE
                        ExitLoop
                Case $msg = $Button_1
                        _Try_to_import_file()
                Case $msg = $Button_2
                        _Try_to_import_folder()
        EndSelect
WEnd

Func _Try_to_import_file();复制文件
        $var = FileOpenDialog('选择复制源文件...', "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", '所有文件' & " (*.*)", 1 + 2 + 4, "", $GUI)
        FileChangeDir(@ScriptDir)
        If @error Then
                Return
        Else
                $Count = 0
                $res = FileSelectFolder('选择复制目标路径...', $Offenes_Projekt, 2, "", $GUI)
                If @error Then
                        Return
                Else
                        If StringInStr($var, "|") = 0 Then
                                $Count = 1
                                _FileOperationProgress($var, $res, 1, $FO_COPY, $FOF_SIMPLEPROGRESS + $FOF_NOCONFIRMATION)
                                If @extended == 1 Then ;ERROR
                                        Return
                                EndIf
                        Else
                                $pfad = StringTrimRight($var, (StringLen($var) - StringInStr($var, "|")) + 1)
                                $filelist = StringTrimLeft($var, (StringInStr($var, "|"))) & "|"
                                $Count = 0
                                While StringLen($filelist) > 1
                                        $Datei = StringTrimRight($filelist, (StringLen($filelist) - StringInStr($filelist, "|")) + 1)
                                        _FileOperationProgress($pfad & "" & $Datei, $res, 1, $FO_COPY, $FOF_SIMPLEPROGRESS + $FOF_NOCONFIRMATION)
                                        $filelist = StringTrimLeft($filelist, StringInStr($filelist, "|"))
                                        $Count = $Count + 1
                                WEnd
                        EndIf
                EndIf
        EndIf
        MsgBox(32, '信息', '文件复制成功!')
EndFunc   ;==>_Try_to_import_file

Func _Try_to_import_folder() ; '复制文件夹'
        $var = FileSelectFolder('选择要复制源文件夹...', "", 1, "", $GUI)
        If @error Then
                Return
        Else
                $Count = 0
                $res = FileSelectFolder('选择复制目标文件夹...', $Offenes_Projekt, 2, "", $GUI)
                If @error Then
                        Return
                Else
                        _FileOperationProgress($var & "\*.*", $res, 1, $FO_COPY, $FOF_SIMPLEPROGRESS + $FOF_NOCONFIRMATION)
                        If @extended == 1 Then ;ERROR
                                Return
                        EndIf
                EndIf
        EndIf
        FileChangeDir(@ScriptDir)
        MsgBox(32, '信息', '文件夹复制完成!')
EndFunc   ;==>_Try_to_import_folder

Func _FileOperationProgress(Const $source, Const $S_DEST = "", Const $I_CREATEDIR = 0, Const $HEX_MODE = 0x0002, Const $HEX_FLAGS = 0x0000)
        Local $objShell = 0
        Local $objFolder = 0
        Local $objScripting = 0
        Local $shfileopstruct = 0
        Local $pFrom = 0
        Local $pTo = 0
        Local $a_dllresult

        ; 创建文件运算结构
        $shfileopstruct = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
        If @error <> 0 Then
                SetError(@error, 3)
                Return (0)
        EndIf
        ; 设置文件运算中元素1的数据为 0,元素2为$HEX_MODE
        DllStructSetData($shfileopstruct, 1, 0) ;~ hwnd 成功返回 0
        DllStructSetData($shfileopstruct, 2, $HEX_MODE) ;~ wFunc 成功返回 2
        #region - pFrom
        ; 创建源路径结构
        $pFrom = DllStructCreate("char[" & StringLen($source) + 2 & "]")
        DllStructSetData($pFrom, 1, $source) ; 设置源路径中元素1为源路径字串
        For $i = 1 To StringLen($source) + 2
                If DllStructGetData($pFrom, 1, $i) = 10 Then
                        DllStructSetData($pFrom, 1, 0, $i)
                EndIf
        Next
        DllStructSetData($pFrom, 1, 0, StringLen($source) + 2)
        DllStructSetData($shfileopstruct, 3, DllStructGetPtr($pFrom))
        #endregion - pFrom
        #region - pTo
        $pTo = DllStructCreate("char[" & StringLen($S_DEST) + 2 & "]")
        DllStructSetData($pTo, 1, $S_DEST)
        DllStructSetData($pTo, 1, 0, StringLen($S_DEST) + 2)
        DllStructSetData($shfileopstruct, 4, DllStructGetPtr($pTo))
        #endregion - pTo
        DllStructSetData($shfileopstruct, 5, $HEX_FLAGS) ;~ fFlags
        DllStructSetData($shfileopstruct, 6, 0) ;~ fAnyOperationsAborted
        DllStructSetData($shfileopstruct, 7, 0) ;~ hNameMappings
        DllStructSetData($shfileopstruct, 8, 0) ;~ lpszProgressTitle
        $a_dllresult = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($shfileopstruct))
        If @error <> 0 Then
                SetError(@error, 2)
                Return (0)
        EndIf
        $shfileopstruct = 0
        $pFrom = 0
        $pTo = 0
        If $a_dllresult[0] <> 0 Then
                SetError($a_dllresult[0], 1)
                Return (0)
        EndIf
        Return (1)
EndFunc   ;==>_FileOperationProgress

评分

参与人数 1金钱 +25 贡献 +2 收起 理由
user3000 + 25 + 2 恭喜前辈又解决一个大问题!

查看全部评分

发表于 2012-6-3 15:02:19 | 显示全部楼层
shfileopstruct 结构可能有问题,老外用ansi的比较多,双字节字符好像不怎么考虑
 楼主| 发表于 2012-6-3 15:06:40 | 显示全部楼层
shfileopstruct 结构可能有问题,老外用ansi的比较多,双字节字符好像不怎么考虑
netegg 发表于 2012-6-3 15:02


谢谢回复!!!
曾经将  DllStructCreate("char"  中的 "char"  修改为 "wchar"  也无效!
 楼主| 发表于 2012-6-4 00:58:33 | 显示全部楼层
顶出。。。。。。。。。。
发表于 2012-6-4 01:54:15 | 显示全部楼层
继续看看学习
发表于 2012-6-4 05:08:58 | 显示全部楼层
本帖最后由 happytc 于 2012-6-4 05:22 编辑

回复 1# 131738


    老外的这段_FileOperationProgress代码,基本也算是垃圾代码的代表了。写得很是ws!


用下面我写的另外一类垃圾代码替换下试试

Func _FileOperationProgress($sSource, $sDest, $iABC, $iMode, $iFlags)
        Local Const $tagSHFILEOPSTRUCT = 'int;uint;ptr;ptr;uint;int;ptr;ptr'
        Local $sStruct, $tFrom, $tTo, $tSHFILEOPSTRUCT, $aRet

        $sStruct = 'wchar[' & (StringLen($sSource) + 1) & '];wchar[1]'
        $tFrom = DllStructCreate($sStruct)
        DllStructSetData($tFrom, 1, $sSource)
        DllStructSetData($tFrom, 2, ChrW(0))
        $sStruct = 'wchar[' & (StringLen($sDest) + 1) & '];wchar[1]'
        $tTo = DllStructCreate($sStruct)
        DllStructSetData($tTo, 1, $sDest)
        DllStructSetData($tTo, 2, ChrW(0))

        $tSHFILEOPSTRUCT = DllStructCreate($tagSHFILEOPSTRUCT)
        DllStructSetData($tSHFILEOPSTRUCT, 1, 0)
        DllStructSetData($tSHFILEOPSTRUCT, 2, $iMode)
        DllStructSetData($tSHFILEOPSTRUCT, 3, DllStructGetPtr($tFrom))
        DllStructSetData($tSHFILEOPSTRUCT, 4, DllStructGetPtr($tTo))
        DllStructSetData($tSHFILEOPSTRUCT, 5, $iFlags)
        
        $aRet = DllCall('shell32.dll', 'int', 'SHFileOperationW', 'ptr', DllStructGetPtr($tSHFILEOPSTRUCT))

        If @error Then
                Return SetError(@error, 2, 0)
                Return 0
        Else
                If $aRet[0] Then
                        Return SetError($aRet[0], 1, 0)
                        Return 0
                EndIf
        EndIf
        Return 1
EndFunc

评分

参与人数 2金钱 +120 贡献 +27 收起 理由
131738 + 100 + 25 谢谢!!!
user3000 + 20 + 2 赞个先!

查看全部评分

 楼主| 发表于 2012-6-4 13:21:02 | 显示全部楼层
本帖最后由 131738 于 2012-6-4 13:22 编辑
回复  131738


    老外的这段_FileOperationProgress代码,基本也算是垃圾代码的代表了。写得很是ws! ...
happytc 发表于 2012-6-4 05:08


谢谢!!!很好用!!!只是有一点不明白:
例如:复制 “F:\测试” 文件夹到 “G:\资料” 文件夹,
结果在 “G:\资料” 文件夹中只是 “F:\测试” 文件夹内的文件和子文件夹,
没有名为“ 测试 ”的文件夹,不知何故。。。
再次谢谢你的代码!!!
 楼主| 发表于 2012-6-4 20:20:30 | 显示全部楼层
回复 6# happytc

打扰了。。。7楼问题我已解决!
再次谢谢!!!
发表于 2012-6-29 11:55:10 | 显示全部楼层
学习,正需要,谢谢了。
发表于 2012-8-5 08:53:56 | 显示全部楼层
都是牛人,新手看不懂啊!!!苦练中
发表于 2013-10-7 23:52:19 | 显示全部楼层
打外标记 明天试验
发表于 2013-12-23 23:44:31 | 显示全部楼层
找了好久的东西,谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-28 15:27 , Processed in 0.096911 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表