对于新文件:
1
取长文件名中头6个合法字符,改为大写,加
~1,取最后一个句点之后的3个合法字符作扩展名。
形成
ABCDEF~1.TXT
这样的名字。
2
检查该目录中
ABCDEF~1.TXT
是否存在,若不存在就是它了。若存在
改为
ABCDEF~2.TXT
再检查,直到出现不重复的文件名。
3
如果第二步重试次数太多(超过4次),就采用生成随机数的方式调整
ABCDEF
这一部分形成
ABF424~1.TXT
这样的名字。
4
把长文件名和短文件名同时写到目录里面。
在获取文件名的时候,一律采用从目录里读出的方式。
因为有的文件没有短文件名,有的软件会单独修改短文件名而不改长文件名。所以对于一个已存在的长名文件,不可能有任何方法能算出他的短文件名来。
不信你可以编写一段程序在同一个目录里产生几百个前面相同的文件名。
你就明白了在特殊情况下,不调用
API,
没有任何办法知道一个文件的短文件名。
下面这段Basic程序就可以做这个实验:
Sub
aa()
For
i
=
1
To
256
Open
"c:\test\ab
cd
ef.
a."
&
Rnd()
&
i
&
".u.
aa
c
u"
For
Output
As
#1
#1,
i
Close
#1
Next
End
Sub
当然,在大多数情况下不会像我们的测试一样变态,顶多也就到
ABCDEF~2.TXT
这种程度。
你可以编写一个程序来完成转换,多数时间都能工作,只是不能保证结果绝对正确罢了。
文件命名时有一个8.3规则8是指文件名,就是楼上说的******.XXX里的***
意思是这个部分不能超过8个字符,在DOS里,如果超过8个字符了是不会被识别的
.后面的XXX是扩展名,也不一定非得是三个字符,像网页文件的扩展名可以是htm也可以是html,只不过国际上习惯于用三个字符来做扩展名
“文件名.扩展名”才是一个文件的完整的名字
文件名用来标识一个单独的文件,指的是一个个体,扩展名标识的是一类文件
using System.Runtime.InteropServices[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetLongPathName(string short_path, StringBuilder long_path, int long_len)
internal static string GetLongPath(string procpath)
{
if (procpath.Length >0)
{
try
{
if (procpath.Contains("~"))
{
StringBuilder sbrlong = new StringBuilder(256)
GetLongPathName(procpath, sbrlong, 256)
procpath = sbrlong.ToString()
}
}
catch(Exception ex)
{
return ex.Message
}
return path
}
return string.Empty
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)