fat32文件系统怎么查找长文件名的

xiaofen8 2011-03-03 04:18:30
百度找了一下没有我想要的答案,fat32找长文件名是根据找到的第一个长目录项来定位短目录项直接比较对应的短文件名呢,还是逐个逐个长目录项去比较(别扭的是长目录项是倒序排列的),
...全文
873 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
address mark是放物理地址的么
ecc是一段可执行代码还是每个扇区都相同的50字节值(即如果此处刚好被弄花了,那么这个值就会被改变,通过这个来校验)
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
闪存的页和内存的页可能大小一样,但结构肯定是不一样的
http://en.wikipedia.org/wiki/Disk_sector
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
和你交流可以学到很多技术上的东西,思维上的就要靠自己了
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
那扇区内部还有更小的结构,是什么
闪存的页和内存的页一样吗
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
那扇区内部还有更小的结构。
这里的等同是存取的最小单位
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
链接上说每个区块构成几个页,意思是一个块由几个页构成,扇区是硬盘最小的单位,那么等同的闪存最小的单位应该是页,不是吗
闪存的也和内存的页一样吗
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
什么意思
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
闪存中和扇区等同的是块,每次存取的单位是块
块比页大?那么闪存中和扇区等同的不是页么
xiaofen8 2011-03-05
  • 打赏
  • 举报
回复
nice
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
address mark有扇区号和一些当前状态
ecc和海明码类似
xiaofen8 2011-03-04
  • 打赏
  • 举报
回复
短文件名只使用长文件名的前两个字母,通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,
然后加后缀"~1"直到最后(如果有必要,或是其他数字以避免重复的文件名),不是这样吗
把OEM字符串开头到第一个句点的最多8个字符复制到8.3文件名的主要名称部分,都没有用到数学的方法?

Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
转换方法

传给文件系统的名字要是unicode字符串,是长文件名

首先把unicode字符串变成大写
然后把unicode字符串转换成OEM字符串,如果有不在OEM编码范围或者不符合8.3格式的字符,用_代替并决定这是一个丢失的转换

去掉OEM字符串开头结尾的空格和开头的句点

把OEM字符串开头到第一个句点的最多8个字符复制到8.3文件名的主要名称部分,把OEM字符串结尾到最后一个句点的最多3个字符复制到8.3文件名的扩展名部分

这个8.3文件名叫基本文件名

如果这个基本文件名不和已有文件名冲突并且长文件名符合8.3格式并且没有丢失的转换,把基本文件名作为短文件名

否则在基本文件名的主要名后面加上~x,如果超过8个字符就覆盖原来的
这时需要遍历整个目录来确定x的数值,保证不和已有短文件名冲突,x的范围是1-999999

这样就得到了短文件名
xiaofen8 2011-03-04
  • 打赏
  • 举报
回复
说实话这样做没有记住长度方便,lseek(handle, 0, SEEK_END)的实现如果直接用文件长度来计算最后一个簇是哪个比较方便
转换成短文件名用数学操纵是什么方法
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xiaofen8 的回复:]

如果目录项的第一字节是0就说明它是最后一个,后面的不能当作此目录的东西,这句话是否用一个目录项指示到了eof,这个目录项只是一个占位符
[/Quote]

xiaofen8 2011-03-04
  • 打赏
  • 举报
回复
如果目录项的第一字节是0就说明它是最后一个,后面的不能当作此目录的东西,这句话是否用一个目录项指示到了eof,这个目录项只是一个占位符
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
目录的长度不能由描述它的目录项得到,目录项的长度是32字节
xiaofen8 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaofen8 的回复:]
即c:\1234567890123转换成c:\123456~1
我只需要读第一个长目录项(即长文件的最后一项)记下检验值和短目录项的名字比较,然后位移到短目录项(可以从长目录项的第一个字节得知距离)然后用c:\123456~1去和短目录项比较,不用还原长目录链
数学操纵是什么方法
[/Quote]
这样会引起冲突所以很麻烦
如果目录项的第一字节是0就说明它是最后一个,后面的不能当作此目录的东西,什么意思呢,目录项的长度不是0吗
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
http://en.wikipedia.org/wiki/Flash_memory
维基百科是好东西
xiaofen8 2011-03-04
  • 打赏
  • 举报
回复
块?能否介绍一下闪存的这些概念,你现在挺好的水平高有比我多的乐趣
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
闪存中和扇区等同的是块,每次存取的单位是块
加载更多回复(48)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧