例如:AB5C8A~1
据我所知,前两个字符来自常规文件名。有人可以指导我看看DOS如何确定第三到第六个字符吗?
答案 0 :(得分:2)
,没有从长文件名创建8.3名称的强制算法,但他们尝试遵循约定。在您的示例中使用文件名,它似乎使用选项4,其中使用文件名的散列来生成4个十六进制数字
我找到了一些代码,但我不知道它是否与微软使用的相同......
来自this site许可证
所有(某些?)来源可用于他们的系统here
/* msdos_short_hex_number --
* Routine to set the hex number in the SFN.
*
* PARAMETERS:
* name - name to change
* num - number to set
*
* RETURNS:
* nothing
*
*/
static void
msdos_short_name_hex(char* sfn, int num)
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
*c++ = '~';
*c++ = '1';
}
答案 1 :(得分:0)
Sean Cheshire在他的回答中提供了一个很好的参考。但这些规则只是部分记录在案。
即使记录了完整的算法,我也看不出如何在不知道包含文件夹的完整历史记录的情况下如何可靠地预测给定文件的8.3名称。分配的名称可能会有所不同,具体取决于在创建之前同一文件夹中存在多少具有相似名称的文件。
获取8.3名称的唯一可靠方法是查询目录。
最简单的方法是使用DIR命令的/x
选项,但该输出不便于解析。
将8.3名称变为变量的最简单方法是将~s
修饰符与FOR变量或CALL参数一起使用。
for %%F in ("long file name.ext") do set "shortName=%~sF"
或
call :getShort "long file name.ext"
exit /b
:getShort
set "shortName=%~s1"
exit /b
注意 - 使用FOR代替CALL
要快得多8.3名称也可通过WMIC DATAFILE别名获得。