[已解决] 请看看这段复制文件的代码,为何不支持中文名称,路径?
本帖最后由 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 Then
SetError($a_dllresult, 1)
Return (0)
EndIf
Return (1)
EndFunc ;==>_FileOperationProgress
shfileopstruct 结构可能有问题,老外用ansi的比较多,双字节字符好像不怎么考虑 shfileopstruct 结构可能有问题,老外用ansi的比较多,双字节字符好像不怎么考虑
netegg 发表于 2012-6-3 15:02 http://www.autoitx.com/images/common/back.gif
谢谢回复!!!
曾经将DllStructCreate("char"中的 "char"修改为 "wchar"也无效! 顶出。。。。。。。。。。 继续看看学习 本帖最后由 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'
$tFrom = DllStructCreate($sStruct)
DllStructSetData($tFrom, 1, $sSource)
DllStructSetData($tFrom, 2, ChrW(0))
$sStruct = 'wchar[' & (StringLen($sDest) + 1) & '];wchar'
$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 Then
Return SetError($aRet, 1, 0)
Return 0
EndIf
EndIf
Return 1
EndFunc
本帖最后由 131738 于 2012-6-4 13:22 编辑
回复131738
老外的这段_FileOperationProgress代码,基本也算是垃圾代码的代表了。写得很是ws! ...
happytc 发表于 2012-6-4 05:08 http://www.autoitx.com/images/common/back.gif
谢谢!!!很好用!!!只是有一点不明白:
例如:复制 “F:\测试” 文件夹到 “G:\资料” 文件夹,
结果在 “G:\资料” 文件夹中只是 “F:\测试” 文件夹内的文件和子文件夹,
没有名为“ 测试 ”的文件夹,不知何故。。。
再次谢谢你的代码!!! 回复 6# happytc
打扰了。。。7楼问题我已解决!
再次谢谢!!! 学习,正需要,谢谢了。 都是牛人,新手看不懂啊!!!苦练中 打外标记 明天试验 找了好久的东西,谢谢分享!
页:
[1]