中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 谁能解释下文件长名变换为短名的机制?
作者:
标题: 谁能解释下文件长名变换为短名的机制? 上一主题 | 下一主题
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『楼 主』:  谁能解释下文件长名变换为短名的机制?

我在space目录下建立了一些目录
列举它们的名字时有这样输出

C:\Space\b b C:\SPACE\BB0139~1
C:\Space\b  b C:\SPACE\BB2715~1
C:\Space\b   b C:\SPACE\BB89A8~1
C:\Space\b    b C:\SPACE\BBAF84~1
C:\Space\b     b C:\SPACE\BBC568~1
C:\Space\b      b C:\SPACE\BBEB44~1
C:\Space\b       b C:\SPACE\BBE348~1

这不是简单的序列关系所能解释的
可能是调用了Win32 API GetShortPathName
但是问题是
谁能解释一下其中具体的变换机制?
我认为应该不会是采用了特别复杂的变换
但究竟是什么呢 ...

2006-10-14 01:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 2 楼』:  

其实我也在想这个问题。如果同一目录下有很多个开始8个字符都相同的文件怎么办? ~1 ~2 ~3 肯定不够的




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-14 02:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 3 楼』:  

这里有VB的一个例子,全在微软网站上:

如何从短文件名获取长文件名
http://support.microsoft.com/kb/154822/zh-cn

文件更改通知可能包含短或长文件名
http://support.microsoft.com/kb/290601/zh-cn

如何从长文件名获得短文件名
http://support.microsoft.com/kb/192827/zh-cn

在微软支持知识库文章搜索内可以找到至少200个左右与8.3文件名计算方法和原理有关的内容,每个都不一样。



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-10-14 02:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 4 楼』:  

转微软一篇文章:

Windows 如何从长文件名生成 8.3 文件名
察看本文应用于的产品
文章编号 : 142982
最后修改 : 2004年12月13日
修订 : 1.2
本文的发布号曾为 CHS142982
概要
Windows 支持的长文件名最多为 255 个字符。Windows 还以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows 的程序访问这些文件。
更多信息
Windows 按以下方式从长文件名生成短文件名:
• Windows 删除文件名中的任何无效字符和空格。无效字符包括:
. " / \ [ ] : ; = ,  
• 由于短文件名只能包含一个英文句点 (.),因此,Windows 将删除文件名中的其他英文句点,即使文件名中最后一个英文句点后面是有效的非空格字符,也是如此。例如,Windows 从长文件名
This is a really long filename.123.456.789.txt
生成短文件名
Thisis~1.txt
否则,Windows 将忽略最后一个英文句点,而使用倒数第二个英文句点。例如,Windows 从长文件名
This is a really long filename.123.456.789.
生成短文件名
Thisis~1.789
• 生成短文件名如果需要的话,Windows 将文件名截断为 6 个字符,并在后边附加一个波形符 (~) 和一个数字。例如,创建的每个以"~1"结尾的唯一文件名。复制文件名以"~2"、"~3"等结尾。
• 生成短文件名Windows 将文件扩展名截断为 3 个字符或更短。
• 生成短文件名Windows 将文件名及扩展名中的所有字符转为大写。
注意,如果文件夹或文件名包含空格但少于 8 个字符,则 Windows 仍会创建短文件名。当通过网络访问此类文件或文件夹时,这种情况可能会引起问题。要解决这个问题,请用有效字符代替空格,例如下划线 (_)。如果执行此操作,则 Windows 不会创建不同的短文件名

例如,"Afile~1.doc"是从"A file.doc"生成的,因为长文件名中包含一个空格。

无法从"A_file.doc"中生成短文件名,因为该文件名中包含的字符少于 8 个并且不包含空格。

短文件名"Alongf~1.txt"是从长文件名"A long filename.txt"生成的,因为长文件名中包含的字符超过 8 个。



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-10-14 02:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 5 楼』:  

3楼的引用只涉及到一个具体的从短名向长名变换的函数
而长名换为短名的机制并没有涉及
4楼的朋友说
“"Afile~1.doc"是从"A file.doc"生成的,因为长文件名中包含一个空格”
这是正确的
但是
对于目录名就不是这样了
比如一个孤立的目录"a  a"(注意有空格)的短名形式为AA1F05~1
这样的话就不好解释了

刚刚做了一个实验
依次增加目录看看输出内容
部分输出如下(长名 短名)

aaaaaaaa1 AAAAAA~1
aaaaaaaa2 AAAAAA~2
aaaaaaaa3 AAAAAA~3
aaaaaaaa4 AAAAAA~4
aaaaaaaa5 AAA40E~1
aaaaaaaa6 AAA41E~1
aaaaaaaa7 AAA42E~1
aaaaaaaa8 AAA43E~1
aaaaaaaa9 AAA44E~1
aaaaaaaaa AAA4C0~1  (下面建立一个aaa4c0~1,再分析它的名字)


aaaaaaaa1 AAAAAA~1
aaaaaaaa2 AAAAAA~2
aaaaaaaa3 AAAAAA~3
aaaaaaaa4 AAAAAA~4
aaaaaaaa5 AAA40E~1
aaaaaaaa6 AAA41E~1
aaaaaaaa7 AAA42E~1
aaaaaaaa8 AAA43E~1
aaaaaaaa9 AAA44E~1
aaa4c0~1 aaa4c0~1
aaaaaaaaa AAA4C0~2 (在原来的基础上加了个一,建立从一到九的aaa4c0~%i)


aaaaaaaa1 AAAAAA~1
aaaaaaaa2 AAAAAA~2
aaaaaaaa3 AAAAAA~3
aaaaaaaa4 AAAAAA~4
aaaaaaaa5 AAA40E~1
aaaaaaaa6 AAA41E~1
aaaaaaaa7 AAA42E~1
aaaaaaaa8 AAA43E~1
aaaaaaaa9 AAA44E~1
aaa4c0~1 aaa4c0~1
aaa4c0~2 aaa4c0~2
aaa4c0~3 aaa4c0~3
aaa4c0~4 aaa4c0~4
aaa4c0~5 aaa4c0~5
aaa4c0~6 aaa4c0~6
aaa4c0~7 aaa4c0~7
aaa4c0~8 aaa4c0~8
aaa4c0~9 aaa4c0~9
aaaaaaaaa AAA4C~10 (减个c,继续加一,我建立10到99的aaa4c~%i)


(省略一部分)
aaa4c~93 aaa4c~93
aaa4c~94 aaa4c~94
aaa4c~95 aaa4c~95
aaa4c~96 aaa4c~96
aaa4c~97 aaa4c~97
aaa4c~98 aaa4c~98
aaa4c~99 aaa4c~99
aaaaaaaaa AAA4~100 (我再建立101到999的目录)

(省略一部分)
aaa4~995 aaa4~995
aaa4~996 aaa4~996
aaa4~997 aaa4~997
aaa4~998 aaa4~998
aaa4~999 aaa4~999
aaa4~100 aaa4~100
aaaaaaaaa AAA~1000 (我不想继续了)

这样看来
和散列表的探测有点相似
如果需要的名字被使用了
那么就按照某种算法继续深入探测
不知道这种算法是什么
请高手留意吧 ...
再者
上边的试验一直做下去
会有名字被用光的情况出现吗?

应该会的
将所有可能的名字长度为9的目录放在一个目录下
然后列出短名来
肯定会失败的

[ Last edited by my3439955 on 2006-10-14 at 09:43 ]

2006-10-14 06:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  


  个人理解:
  
  理论上,可以在磁盘的某个目录下建无数个空文件夹,而且文件名都是满了8个字符,且前8个字符都是相同的,而短文件名是用aaaaaa~1的形式表示的,所以光靠这7个字符来表示这“无数个”目录,是不可能的吧?
  
  所以同意楼上兄弟说的“列出短文件名肯定会失败的”观点。


2006-10-14 09:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 7 楼』:  

有趣的试验




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-14 09:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 8 楼』:  

可不可以请高手分析下dll文件中的GetShortPathNameA函数的代码

2006-10-14 09:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  

  同意楼上my3439955的意见,不过这好像超出了批处理室的研究范围吧?

2006-10-14 09:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 10 楼』:  

研究到这个地步也很无敌了。不过现在dos都支持长文件名了,不存在这些问题喽




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-14 11:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 11 楼』:  

长名字的话得要引号
加来加去怪麻烦
做参数传递时
有时候还得考虑引号的存在
这样看来
还是不如短名来得方便

2006-10-14 22:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 12 楼』:  

9楼说得也不是没有道理
但是这就像吃饭一样
我们不但关注饭的味道
好吃的饭菜
我们还想知道它是怎么做出来的

2006-10-15 05:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 13 楼』:  

WillSort呢
在哪里?
好久不来了吗

2006-10-17 06:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: