找回密码
 加入
搜索
楼主: afan

[系统综合] 获取畸形文件夹的短文件名

 火... [复制链接]
发表于 2010-4-1 22:41:27 | 显示全部楼层
来学习了''''''
发表于 2010-4-2 13:02:49 | 显示全部楼层
回复 1# afan

afan真是厉害啊,高手是怎么练成啊!
发表于 2010-4-3 18:44:54 | 显示全部楼层
http://autoitx.com/forum.php?mod=viewthread&tid=13921
这个不就可以了吗?
可以给畸形文件夹设置ARSH属性呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2010-4-3 20:26:02 | 显示全部楼层
回复 64# hearton

这里只是讨论获取其短文件名,而且一楼早已有过方法(见附件),只是想能否有更好的方法~
就设置属性问题以下即可
#include "_FileGetShortName.au3"
$file = 'c:\test.' ;畸形文件夹路径
$n = _FileGetShortName($file) ;获取短文件名
FileSetAttrib($n, '+r+a+s+h') ;增加RASH属性
Msgbox(0, 0, $file & ' 已消失,点击确定后出现~')
FileSetAttrib($n, '-r-a-s-h') ;去除RASH属性
发表于 2010-4-4 10:47:55 | 显示全部楼层
试用了一下新的函数,还是有问题。
如:要得到文件夹 Resource Hacker 3.5. 的短文件名,会得到返回值0!
 楼主| 发表于 2010-4-4 13:35:50 | 显示全部楼层
回复 66# 卫和谐


    奇怪,我这正常返回

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-4-6 12:02:53 | 显示全部楼层
本帖最后由 dtooboss 于 2010-4-6 12:12 编辑
        $result = DllCall("kernel32.dll", "int", "GetShortPathName", "str", $aFile, "str", "", "int", 260)        
        ConsoleWrite($result[2]&@LF)
上面的代码  $result[0] = 0 的是畸形文件夹可以用 if 判断    $result[1] = 长文件名 $result[2] = 短文件名。
  




短文件名命名是无规则的,因为短文件名可以被更改,提供个思路。

用 kernel32.dll 的 SetShortPathName 函数可以把畸形文件夹的短文件名直接改为 头两个字符+固定6个字符就行了,

这样只用读长文件名的头两个字符就能得到当前的短文件名了。

评分

参与人数 1金钱 +30 贡献 +2 收起 理由
afan + 30 + 2

查看全部评分

 楼主| 发表于 2010-4-6 12:12:01 | 显示全部楼层
短文件名命名是无规则的,因为短文件名可以被更改,提供个思路。

用 kernel32.dll 的 SetShortPathName  ...
dtooboss 发表于 2010-4-6 12:02


貌似不能获取畸形文件夹的短名,请测试下,谢谢
发表于 2010-4-6 12:14:17 | 显示全部楼层
本帖最后由 dtooboss 于 2010-4-6 12:16 编辑
貌似不能获取畸形文件夹的短名,请测试下,谢谢
afan 发表于 2010-4-6 12:12


嗯,这个是底层核心函数了,只有通过得到长文件名的句柄,在取得段文件名的前面用 SetShortPathName 统一更改畸形文件夹的短文件名,就能得到了。

也就是说,我们更本先不用得到,你设置他是什么短文件名,他就变成什么了。
 楼主| 发表于 2010-4-6 12:22:47 | 显示全部楼层
嗯,这个是底层核心函数了,只有通过得到长文件名的句柄,在取得段文件名的前面用 SetShortPathName 统 ...
dtooboss 发表于 2010-4-6 12:14



    你的意思是可以直接修改底层的短文件名,而不会改变长文件名?能否举例说明下
$a = 'abc 3.5.'
RunWait(@ComSpec & ' /C Md "' & $a & '."', '', 0)
如何获取 'abc 3.5.' 的短名,谢谢~
发表于 2010-4-6 12:28:49 | 显示全部楼层
afan, apiex里有这个函数
 楼主| 发表于 2010-4-6 12:29:59 | 显示全部楼层
afan, apiex里有这个函数
netegg 发表于 2010-4-6 12:28



    哦,是哪个?
发表于 2010-4-6 12:41:17 | 显示全部楼层
回复 74# afan
_WinAPI_ShellGetFileInfo,看看这个行不行
发表于 2010-4-6 12:49:25 | 显示全部楼层
本帖最后由 dtooboss 于 2010-4-6 13:03 编辑
bool SetFileShortName(IntPtr hFile, string lpShortName);
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Function SetFileShortName Lib "kernel32.dll" Alias "SetFileShortNameA" (ByVal handle As Long, ByVal lpszShortName As String) As Boolean
本来长文件名和短文件名就没有必然的对应关系(后6字符)
只是在 $mtf 目录结构里生成了一个标记而已,
用 kernel32.dll 的  SetFileShortName 函数可以更改这种对应
可以理解为 line 或者类似快捷方式的形式,所以短文件名可以更改。
而长文件名却可以保持不变。

格式应该是  DllCall("kernel32.dll", "bool", "SetShortPathName", "Int_Ptr", $hFile, "str", "xxxxxx~1"); $hFile 为文件句柄。

评分

参与人数 1威望 +2 收起 理由
afan + 2

查看全部评分

 楼主| 发表于 2010-4-6 13:13:56 | 显示全部楼层
回复  afan
_WinAPI_ShellGetFileInfo,看看这个行不行
netegg 发表于 2010-4-6 12:41



    貌似不行…
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-19 14:51 , Processed in 0.080598 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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