mys_jaqal 发表于 2010-10-21 13:19:05

[已解决]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

chenronting 发表于 2010-10-21 17:14:32

您这个不是一般的强大. 我输入中文,它给我的也是:中文六个,加'~1',,这样实际等于14.3而不是8.3了,还有,如果有中文前四个同名文件夹超过4个文件夹的。 他的命名方式也将不一样。你可以看一下Afan前辈的文章。
地址:http://www.autoitx.com/forum.php?mod=viewthread&tid=14026

maxkingmax 发表于 2010-10-21 18:47:33

兄弟,多看看帮助,AU3本身就提供转换函数
FileGetShortName ( "文件" [, 标志] )

kood481748 发表于 2010-10-21 19:58:49

同意楼上的!
我也记得AU3本身就有这么一个函数,你还去自己写一个东西出来,即存在问题又浪费了时间。
楼主兄弟应该多看看帮助文档了。

bsdos 发表于 2010-10-21 22:56:43

重复造轮子,不过对新手来练手还是很不错的,支持一下

afan 发表于 2010-10-22 00:50:14

即便如此,LZ的第一贴就是源码交流,这很不错~
虽然已有内置函数 FileGetShortName() ,但其不能返回某些特殊的文件夹短文件名,如末尾带点的畸形文件夹。LZ如有兴趣可以继续研究下~

19377708 发表于 2010-10-22 01:21:23

支持下! {:face (396):}

3mile 发表于 2010-10-22 10:04:28

2楼的问题应该可以用字符串2进制长度解决掉吧。
AFAN兄所说的畸形文件应该是难点。
楼主加油啊

mys_jaqal 发表于 2010-10-22 20:56:16

本帖最后由 mys_jaqal 于 2010-10-23 13:16 编辑

中文的问题已经解决 畸形正在研究中
非常感谢各位前辈[/b

mys_jaqal 发表于 2010-10-22 21:02:32

顺便问一下各位前辈 我发的代码如何让它语法高亮 谢谢!!!

chenronting 发表于 2010-10-23 14:26:41

回复 4# kood481748


    主要是对 畸形文件,你去看一下2#里面的连接, Afan写的真不错

kood481748 发表于 2010-10-23 14:32:15

A版还是很有才华的,如果没有畸形文件,那就用不到A版的代码了。
AU3本身的一小个函数就解决了。

19377708 发表于 2010-10-24 03:29:54

不错不错,楼主的分享精神,值得鼓励!

mys_jaqal 发表于 2010-10-29 15:11:32

感谢各位前辈的参与和帮助!!

曼菲士 发表于 2011-2-13 22:42:56

楼主的代码和FileGetShortName无法识别 C:\AB 不超过8个的但又是长文件名的目录
页: [1] 2
查看完整版本: [已解决]Au3 Windows下长路径转DOS路径 热切欢迎修改优化