afan 发表于 2010-3-31 14:05:01

获取畸形文件夹的短文件名

本帖最后由 afan 于 2010-4-3 20:17 编辑

畸形文件夹就是在Windows中无法或难以通过正常途径进行建立、查看、删除等操作的小强文件夹。
这里以结尾带点的字码畸形为例讨论如何获取畸形文件夹的短文件名,以拓展为Au3使用(如重命名、移动畸形文件夹等操作)。
;
以下为我做的简单测试
;
直接用 FileGetShortName() 不行,因为它不承认畸形文件夹的存在...
;
用 for /f "delims=" %%a in ("畸形文件夹路径") do @echo %%~sa 也不行,因为在这里畸形文件夹路径中的畸形文件夹必须以短文件名表示(我就是不知道短文件名,真晕)
;
直接自己根据规则命名,貌似这8个字符的命名规则很难办,并非简单的 xxxxxx~i,对于短于8个字节的畸形文件夹名要添加字母及数字,还有前8个字节相同的还要递加,如xxxxxx~2、xxxxxx~3等,还有小数点的位置等等,此路不通……
;
最后想到的是,如果畸形文件夹所在的路径为正常目录,则可以先dos进入此目录,然后dir /x来获取畸形文件夹的短文件名,当然也可以采取下面的查找方式。再通过回显得到这该死的短名。
for /f "tokens=4 delims= " %%a in ('dir /x "畸形文件夹所在的正常目录"^| findstr "畸形文件夹"') do @echo %%a
;
附件是本人写的,需要的可以参考

不知有没有高手有简单的方法?希望能很轻松的送出100金钱,呵呵~

;===========================================;
以下几个关于畸形文件夹操作的例子,可以给测试提供条件

;创建畸形文件夹 ab.$a = 'ab.'
RunWait(@ComSpec & ' /C Md "' & $a & '.\"', '', 0)
If FileExists($a & '.\') Then MsgBox(64, '完成', '已成功创建文件夹:"' & $a & '" 文件夹');
;打开畸形文件夹 ab.$a = 'ab.'
RunWait('explorer.exe "' & $a & '.\"');
;复制文件到畸形文件夹 ab.$a = 'ab.'
RunWait(@ComSpec & ' /C copy "' & @ScriptFullPath & '" "' & $a & '.\"', '', 0)
If FileExists($a & '.\' & @ScriptName) Then MsgBox(64, '完成', '已成功复制文件:"' & @ScriptName & '"');
;删除畸形文件夹 ab.$a = 'ab.'
RunWait(@ComSpec & ' /C rd "' & $a & '.\" /s /q', '', 0)
If Not FileExists($a & '.\') Then MsgBox(64, '完成', '已成功删除文件夹~ ')
;

pizigao 发表于 2010-3-31 14:08:51

太高深了~帮afan顶一下!

l4ever 发表于 2010-3-31 15:59:50

这也太简单了把,dir/x

afan 发表于 2010-3-31 16:01:00

这也太简单了把,dir/x
l4ever 发表于 2010-3-31 15:59 http://www.autoitx.com/images/common/back.gif


    dir /x 一楼没说吗?

C.L 发表于 2010-3-31 16:20:16

本帖最后由 C.L 于 2010-3-31 16:21 编辑

afan看看我这代码合不合用?
$f="testeee..\"
$Sn = getShutName ($f)
MsgBox (0,$f&"的短文件名是",$Sn)

Func getShutName ($filename)
        $split = StringLeft ($f,StringInStr ($filename,".")-1)
        If StringLen ($split)>6 Then
                $fShutname = StringLeft($filename,6) & "~1"
        Else
                $fShutname = $split&"~1"
        EndIf
        Return $fShutname
EndFunc

afan 发表于 2010-3-31 16:24:08

回复 5# C.L


   
$f="te..\" ;如果小于8字节就不对了
$f="双字节字符..\" ;如果是双字节字符也不对

C.L 发表于 2010-3-31 16:24:20

上面的代码对于象"test.eee...\"这样的文件没用,不过要处理起来也不难,我就懒得做了.

afan 发表于 2010-3-31 16:29:45

本帖最后由 afan 于 2010-3-31 20:55 编辑

上面的代码对于象"test.eee...\"这样的文件没用,不过要处理起来也不难,我就懒得做了.
C.L 发表于 2010-3-31 16:24 http://www.autoitx.com/images/common/back.gif


    一楼我已经说过了,自己找命名规则似乎很难,不是简单的 ~i 操作
1,文件夹名短于8字节
2,文件夹名中间含"."
3,前8字节相同的其它文件
4,。。。

哈~

afan 发表于 2010-3-31 16:51:52

比如以下文件夹对应的短文件名:

ab. —— AB1BE5~1
a.畸. —— A畸~1
a畸. —— A畸~2

afan 发表于 2010-3-31 17:01:51

本帖最后由 afan 于 2010-3-31 21:27 编辑

1楼添加了几个关于畸形文件夹操作的例子,可以给测试提供条件

chenronting 发表于 2010-3-31 17:11:39

我有时候在最后面加一个点。 也没能进去。 是什么原因呢。

这种文件夹是不是都只要加一个点就能进去了呢?

C.L 发表于 2010-3-31 17:12:34

本帖最后由 C.L 于 2010-3-31 17:13 编辑

回复 9# afan

中间带点的可以处理,但ab. -- AB1BE5~1   和a. -- AE216~1 这种头痛,这种短文件没有规律~~

另: 猜测得出shutname ,可以用FileGetLongName获得长文件名,如下面这段代码有效:
$f="testeee..\"
$Sn = getShutName ($f)
MsgBox (0,$f&"的短文件名是",$Sn)

Func getShutName ($filename)
        $split = StringLeft ($filename,StringInStr ($filename,".")-1)
        If StringLen ($split)>6 Then
                For $i=1 To 6
                        $fShutname = StringLeft($filename,6) & "~"&$i
                        $filepath = @ScriptDir
                        If StringRight ($filepath,1) == "\" Then $filepath = StringTrimRight ($filepath,1)
                        $ln = FileGetLongName ($fShutname,1)
                        If $ln == $filepath&"\"&StringLeft ($filename,StringLen($filename)-2) Then
                                Return ($fShutname)
                        EndIf
                Next
        Else
                $fShutname = $split&"~1"
        EndIf
        Return $fShutname
EndFunc

C.L 发表于 2010-3-31 17:15:16

上面这段可以判断大于6的同短名的文件.

261869247 发表于 2010-3-31 17:16:30

都帮你们顶顶 来学习了

afan 发表于 2010-3-31 17:24:52

回复 13# C.L


    这样获取的貌似不正确,你用10楼的代码生成一个 testeee. 文件夹,再 dir /x 看看~
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 获取畸形文件夹的短文件名