找回密码
 加入
搜索
查看: 8666|回复: 15

[AU3基础] [已解决]Au3 Windows下长路径转DOS路径 热切欢迎修改优化

 火.. [复制链接]
发表于 2010-10-21 13:19:05 | 显示全部楼层 |阅读模式
本帖最后由 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[0]
                ;用"."分割得到的字符串
                $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[0] Then
                        If $JDot[0] >= 2 And $JDot[2] = "" 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[0] >= 2 And $JDot[2] = "" 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[0]], "", -1)
                                ;有字符串则判断是否超长
                                If $ZHCN = 1 Then
                                        $JDos = $JDos & $JSplit[$Ji] & '~1.' & $JDot[$JDot[0]] ;如果含有中文字符直接阉割后加上后缀名组合输出
                                ElseIf StringLen($JSplit[$Ji]) > 8 Then
                                        $JDos = $JDos & StringLeft($JSplit[$Ji], 6) & '~1.' & $JDot[$JDot[0]] ;超长就阉割后加上后缀名组合输出
                                Else
                                        $JDos = $JDos & $JSplit[$Ji] & '.' & $JDot[$JDot[0]] ;不超出就加上后缀名组合输出
                                EndIf
                        EndIf

                EndIf

        Next

        Return $JSplit[1] & '\' & $JDos
EndFunc   ;==>PathToDos
发表于 2010-10-21 17:14:32 | 显示全部楼层
您这个不是一般的强大. 我输入中文,它给我的也是:中文六个,加'~1',,这样实际等于14.3而不是8.3了,还有,如果有中文前四个同名文件夹超过4个文件夹的。 他的命名方式也将不一样。你可以看一下Afan前辈的文章。
地址:http://www.autoitx.com/forum.php?mod=viewthread&tid=14026
发表于 2010-10-21 18:47:33 | 显示全部楼层
兄弟,多看看帮助,AU3本身就提供转换函数
FileGetShortName ( "文件" [, 标志] )

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
kood481748 + 10 + 1

查看全部评分

发表于 2010-10-21 19:58:49 | 显示全部楼层
同意楼上的!
我也记得AU3本身就有这么一个函数,你还去自己写一个东西出来,即存在问题又浪费了时间。
楼主兄弟应该多看看帮助文档了。
发表于 2010-10-21 22:56:43 | 显示全部楼层
重复造轮子,不过对新手来练手还是很不错的,支持一下
发表于 2010-10-22 00:50:14 | 显示全部楼层
即便如此,LZ的第一贴就是源码交流,这很不错~
虽然已有内置函数 FileGetShortName() ,但其不能返回某些特殊的文件夹短文件名,如末尾带点的畸形文件夹。LZ如有兴趣可以继续研究下~
发表于 2010-10-22 01:21:23 | 显示全部楼层
支持下!
发表于 2010-10-22 10:04:28 | 显示全部楼层
2楼的问题应该可以用字符串2进制长度解决掉吧。
AFAN兄所说的畸形文件应该是难点。
楼主加油啊
 楼主| 发表于 2010-10-22 20:56:16 | 显示全部楼层
本帖最后由 mys_jaqal 于 2010-10-23 13:16 编辑

中文的问题已经解决 畸形正在研究中
非常感谢各位前辈[/b
 楼主| 发表于 2010-10-22 21:02:32 | 显示全部楼层
顺便问一下各位前辈 我发的代码如何让它语法高亮 谢谢!!!
发表于 2010-10-23 14:26:41 | 显示全部楼层
回复 4# kood481748


    主要是对 畸形文件,你去看一下2#里面的连接, Afan写的真不错
发表于 2010-10-23 14:32:15 | 显示全部楼层
A版还是很有才华的,如果没有畸形文件,那就用不到A版的代码了。
AU3本身的一小个函数就解决了。
发表于 2010-10-24 03:29:54 | 显示全部楼层
不错不错,楼主的分享精神,值得鼓励!
 楼主| 发表于 2010-10-29 15:11:32 | 显示全部楼层
感谢各位前辈的参与和帮助!!
发表于 2011-2-13 22:42:56 | 显示全部楼层
楼主的代码和FileGetShortName无法识别 C:\A  B 不超过8个的但又是长文件名的目录
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 10:21 , Processed in 0.079713 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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