【常见问答】“文件名对目标文件夹可能过长”问题的原因和解决方法
提问:“文件名对目标文件夹可能过长”这个问题怎么解决?
回答(By 0xAA55):
嘛,我要告诉你这个问题出在哪。
1、现在大家的电脑都是NTFS或者FAT32(Linux是ext4、ext3、ext2等,苹果是HFS、HFS+等,然后除了这些,还有其它的),当年FAT16、FAT12时代遗留下来的历史问题是,当时没有“长文件名”这种概念。
当时的文件、文件夹的名字总长度(包括文件扩展名)不得超过11,且必须是全大写。其中文件名是8个字符,扩展名是3个字符,共11个,并且不能有空格。
然后当时几乎所有Windows程序都是只支持260个字符的路径总长度。(因为Windows.h里面有个宏叫“MAX_PATH”,它的值就是260)
比如A:\BOOT\PROMPT.COM这种,就很短。
而A:\BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOT\FOLDER1\FOLDER2\FOLDER3\FATHER\MOTHER\PARENTS\SON\FOO\BAR\FOOBAR\123123123123123123123123123213123\23333333333333333\666666666666666666666666666666666\1.exe
这种就很长,
因为它在很多层文件夹里,
所以总长度超过250的话,就缓冲区溢出了,然后当时微软还发表了很多的说法,对“缓冲区溢出攻击”表现出了不屑的态度,被人嘲讽
你要做的是,你把你的那堆东西移回你的D盘根目录,
这样能减少文件夹的路径的长度
然后把你改过的文件的名字都改回来
因为程序识别文件完全是靠的文件名,而不是文件的内容
就算你那个文件在那里,它名字不是之前的那个,它就不能被你的程序找到。
这是历史遗留问题。
2、Linux通常支持到4096个字符的吧,我是这种感觉。
有的程序应该能支持更长的路径吧。看它是拿多大的缓冲区来存这个字符串的。如果它是动态分配内存来存储字符串的,那多长都行(只要内存够用,但一般足够了,几个G还不够它存个路径?)
很多开源库都是默认用4096个字符(不,应该是字节吧)的缓冲区的。
用中文的时候会有点蛋疼,对于UTF-8编码的情况,中文字符(以及日文、俄文、带音调的汉语拼音字符等)一般占3个字节,而英文字符则占1个字节,有时候莫名其妙你就会遇到这种文件夹名过长的现象。
搞不好会因为缓冲区溢出而GG,所以尽量不要把东西丢到过深的文件夹里。
哦对了FAT12、FAT16格式的分区根目录能容纳的文件的个数是有限的,即使存储的空间戳戳有余。这是因为“根目录表”的尺寸是钦定的。必要的时候还是需要把一些东西丢文件夹的。
3、这是按字符计算的,而不是字节,因此Windows下你可以有260个汉字。(因为这是用的unicode)
实测256个字符。因为长文件名用的是Unicode存储的。
另外长文件名和短文件名之间是可以互相转换的,比如你有这样一个文件夹,它存储了以下的几个文件:
a.txt
configure.txt
configurable_lists.txt
硬盘里是实际存储了这些个文件的短文件名的,一般来说是下面这样的吧:
A.TXT
CONFIG~1.TXT
CONFIG~2.TXT
然后在DOS下你如果没有用支持长文件名的插件的话,你就只能通过短文件名来访问指定文件了。
对于有中文字符的情况的话,短文件名也是取的前六个字节(而且一般是GB2312编码的字符),就像下面:
新建文本文档.txt
考试说明.docx
某某表格.xlsx
某某表格 - 副本.xlsx
2016年考试例题.docx
然后它存储的短文件名是这样的吧:
新建文~1.txt
考试说~1.docx
某某表~1.xlsx
某某表~2.xlsx
2016年~1.docx
但DOS是不支持中文显示的,所以就会变成以下这样:
虽然DOS不支持中文吧,但它文件名就这么摆在那,这些字符也是实际存在的,所以只要你也能打出这些字符,这些文件也是能够被打开的。
提问:
也就是说将文件移到d盘根目录就可以了么?
回答:
嗯。
页:
[1]