[已解决]Au3 Windows下长路径转DOS路径 热切欢迎修改优化
本帖最后由 mys_jaqal 于 2010-10-29 15:14 编辑代码已经重新修改 添加了中文字符判断和畸形文件夹判断
非常感谢各位前辈的关注和帮助
; =====================================================
;
; 函数说明:JPathToDos("路径") 返回Windows下长路径的Dos路径字符窜.
; 详细信息:请输入完整路径.如"c:\asdfg\qwe\"或"c:\asdfg\qwe\asd.txt"
; 返回值:Dos路径字符窜.
;
; =====================================================
Func PathToDos($JPath)
;用"\"将路径分割
Local $JSplit = StringSplit($JPath, "\")
Local $Ji
Local $JDos
Local $JDot
Local $ZHCN
;开始组合
For $Ji = 2 To $JSplit
;用"."分割得到的字符串
$JDot = StringSplit($JSplit[$Ji], ".")
;如果含有中文最多返回前3个字符
If StringIsASCII($JSplit[$Ji]) = 0 Then
$JSplit[$Ji] = StringLeft($JSplit[$Ji], 3) ;如果含有中文字符直接阉割
;用于标识进行分割字符的是中文
$ZHCN = 1
Else
$ZHCN = 0
EndIf
;如果用"\"分割后的字符窜段不是最后一段则进行超长判断
If $Ji <> $JSplit Then
If $JDot >= 2 And $JDot = "" Then ;如果含有畸形路径 如"d:\OneKeyGhost.\" 则用"."分割后第二段字符为空
;删除其中的"."
$JSplit[$Ji] = StringReplace($JSplit[$Ji], ".", "")
EndIf
If $ZHCN = 1 Then
$JDos = $JDos & $JSplit[$Ji] & '~1\' ;如果含有中文字符输出阉割后的字符
ElseIf StringLen($JSplit[$Ji]) > 8 Then
$JDos = $JDos & StringLeft($JSplit[$Ji], 6) & '~1\' ;超长就阉割后组合输出
Else
If $JDot >= 2 And $JDot = "" Then
$JDos = $JDos & $JSplit[$Ji] & "~1\" ;如果含有畸形路径且不超长就加"~1\"组合输出
Else
$JDos = $JDos & $JSplit[$Ji] & "\" ;不超出就直接组合输出
EndIf
EndIf
Else
;如果是最后一段
If $JSplit[$Ji] = "" Then
$JDos = $JDos ;不在有字符则直接输出
Else
;先删除最后一个点和以后的内容
$JSplit[$Ji] = StringReplace($JSplit[$Ji], '.' & $JDot[$JDot], "", -1)
;有字符串则判断是否超长
If $ZHCN = 1 Then
$JDos = $JDos & $JSplit[$Ji] & '~1.' & $JDot[$JDot] ;如果含有中文字符直接阉割后加上后缀名组合输出
ElseIf StringLen($JSplit[$Ji]) > 8 Then
$JDos = $JDos & StringLeft($JSplit[$Ji], 6) & '~1.' & $JDot[$JDot] ;超长就阉割后加上后缀名组合输出
Else
$JDos = $JDos & $JSplit[$Ji] & '.' & $JDot[$JDot] ;不超出就加上后缀名组合输出
EndIf
EndIf
EndIf
Next
Return $JSplit & '\' & $JDos
EndFunc ;==>PathToDos
您这个不是一般的强大. 我输入中文,它给我的也是:中文六个,加'~1',,这样实际等于14.3而不是8.3了,还有,如果有中文前四个同名文件夹超过4个文件夹的。 他的命名方式也将不一样。你可以看一下Afan前辈的文章。
地址:http://www.autoitx.com/forum.php?mod=viewthread&tid=14026 兄弟,多看看帮助,AU3本身就提供转换函数
FileGetShortName ( "文件" [, 标志] ) 同意楼上的!
我也记得AU3本身就有这么一个函数,你还去自己写一个东西出来,即存在问题又浪费了时间。
楼主兄弟应该多看看帮助文档了。 重复造轮子,不过对新手来练手还是很不错的,支持一下 即便如此,LZ的第一贴就是源码交流,这很不错~
虽然已有内置函数 FileGetShortName() ,但其不能返回某些特殊的文件夹短文件名,如末尾带点的畸形文件夹。LZ如有兴趣可以继续研究下~ 支持下! {:face (396):} 2楼的问题应该可以用字符串2进制长度解决掉吧。
AFAN兄所说的畸形文件应该是难点。
楼主加油啊 本帖最后由 mys_jaqal 于 2010-10-23 13:16 编辑
中文的问题已经解决 畸形正在研究中
非常感谢各位前辈[/b 顺便问一下各位前辈 我发的代码如何让它语法高亮 谢谢!!! 回复 4# kood481748
主要是对 畸形文件,你去看一下2#里面的连接, Afan写的真不错 A版还是很有才华的,如果没有畸形文件,那就用不到A版的代码了。
AU3本身的一小个函数就解决了。 不错不错,楼主的分享精神,值得鼓励! 感谢各位前辈的参与和帮助!! 楼主的代码和FileGetShortName无法识别 C:\AB 不超过8个的但又是长文件名的目录
页:
[1]
2