叶帆工作室

嵌入式开发爱好者(十年开发经验,精通C/C++/VC/VB/C#...)

刘洪峰ID:yefanqiu
493520次访问,排名81好友0人,关注者130
微软MVP / CSDN 2008十大MVB/MSDN中文技术论坛版主
yefanqiu的文章
原创 213 篇
翻译 0 篇
转载 3 篇
评论 1035 篇
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
兰馨谷:多谢!!!



兰馨谷:确实不错
用了多年的VB也没怎么过深的去研究
总是觉得够用就满足了,呵呵很难进步了
用博主提到的其中一个方法
VB工程引用引用,
保存后文本编辑器查看相应GUID
未能成功,后来还是下载RegCtrls.exe
(显示全部类)获得类ID(GUID),并看出了
原来VB工程里引用的是TypeLib

出来打酱油的:做自动化的人软件开发水平真的很低,呵呵
侯磊:你们在北京有很多人可以交流,这对于提高水平有很大的帮助。俺在苏州也没有人跟俺交流,只能自己去思考了。郁闷
girlblank:生成dll的时候,出现
“代码生成器或链接器中出现未知的错误”
查看错误信息,如下显示:

“Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LI……
文章分类
收藏
    相册
    叶帆照片
    【叶帆软件】
    [01]VB源码之友(V2.1.548)
    [02]API浏览器.net(V5.0)
    [03]叶帆成语词典(V2.0.8)
    [04]叶帆密码库(V1.2.8)
    【叶帆资源】
    DAO 2.0引擎
    叶帆快速通道
    Windows Embedded 专题
    中文MSDN
    叶帆圈子--工业自动化
    叶帆工作室(博客园)
    叶帆工控--工业自动化
    叶帆群组--工业应用开发
    微软中文技术论坛
    瑞康社区论坛
    叶帆友情链接
    张欣
    枕善居
    莫依
    葛涵涛
    郑建
    陈辉
    马宁
    马骐
    魏涛序
    黎波
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 FAT文件系统几点释疑收藏

    新一篇: 论本我、自我、超我对人工智能的启示

    春节前微软MF负责人员就提出用C#实现MF的文件系统,由于前一段时间事务相对比较繁忙,所以直到上礼拜六才开始深入研究FAT文件系统。其实FAT文件系统早在九十年代中期上大学初的时候就已经了解,当时有一款叫PCTools的工具软件,可以直接读写磁盘的扇区,由于当时的软盘很容易坏(常见的就是0磁道被划伤),所以那个时候能用PCTools修复软盘的在我眼中都是高手。当时对FAT表,32个字节的文件(或目录)信息表基本都了解,唯一比较可惜的是,自己从来都没有用PCTools修改过磁盘的扇区信息(为什么呢?我想不外乎如下几个原因,一、相关资料比较匮乏(互联网真是一个好东西);二、掌握这种技能的人相对比较保守,不肯轻易示人;三、当时我的主要兴趣是用C语言实现各种数学算法,直到现在,我的内心深处也是对相对偏硬的知识有一种近乎本能的排斥(我当时编写的那些程序直到今天都运行正常,那些相对偏硬(或偏底层)一点的技术,如驻留内存技术、直接打屏技术、修改中断向量表技术、操作Bios中断、DOS中断技术、西文DOS下显示汉字技术,其实到目前已经作古))。

        下面几点疑问其实就是我的疑问,不敢说我的理解是正确的,但最起码比以前的理解更接近真相。

    1、  FAT32FAT16文件系统在数据存取方面更有效率,因为它的簇数所占字节数比后者小?

    答:这种理解是比较片面的。如下表(微软默认格式化参数)

    FAT16文件系统

    FAT32文件系统

    磁盘大小

    扇区/

    字节数

    磁盘大小

    扇区/

    字节数

    4.1~16MB

    2

    1k

    32.5~260MB

    1

    512

    <=128MB

    4

    2k

    <=8GB

    8

    4k

    <=256MB

    8

    4k

    <=16GB

    16

    8k

    <=512MB

    16

    8k

    <=32GB

    32

    16k

    <=1GB

    32

    16k

    >32GB

    64

    32k

    <=2GB

    64

    32k

     

     

     

    其实对小容量存储器<=256M我倒是时比较建议用FAT16格式,至于小于4M的存储器那就不要难为FAT16了,直接采用FAT12吧。

     

    2、  怎样区分FAT12FAT16FAT32文件系统?

    答:通过数据区所占用的簇数来判断,微软的文档中号称这是检查FAT文件系统类型的唯一办法,称这个世上不存在簇数大于4084FAT12卷,也不存在簇数小于4085或是大于65524FAT16卷,同样没有哪个FAT32卷的簇数小于65525。如果你坚持要违背这个规则来创建一个FAT卷,那么微软的操作系统将无法对此卷进行操作,因为它不认为这是FAT文件系统。

       簇数=(扇区总数-(保留扇区数+FAT表个数*FAT表所占扇区数)+根目录所占扇区数))/每簇扇区数

     

    3、  主要分区、扩展分区、逻辑驱动器?

    答:磁盘系统最初设计的时候,认为一个磁盘分四个分区就够了,这四个分区就是主要分区,由磁盘引导扇区DPT磁盘分区表进行配置(一个分区配置占16个字节,共64个字节)。随着硬盘容量的增大(更有可能的是最初设计的时候就已经考虑到了这种情况),分四个分区不能满足需要了,特别是FAT16时代,一个硬盘大于8G,分四个区后,剩下的空间就没法利用了。扩展分区这个时候的意义就来了,可以把扩展分区又看成一个小磁盘,它的初始扇区的地址由DPT磁盘分区表任意4个中的任一个指定(注意,在磁盘类型这个字节的配置中一定设置为0x05,它告诉系统,这个地址指向的分区是扩展分区,其它常用的值如,01-FAT32 06-FAT1607-NTFS分区,在不知道这个知识的情况下,害的我到处到在google上搜索,怎样区分MDRDBR扇区信息)。逻辑驱动器是扩展分区这个小磁盘上的主要分区,不过这个分区前面一定要有虚拟MDR引导记录扇区,这个扇区中DPT磁盘分区表再指向实际的磁盘分区(有点绕),这时候的分区内容就和主要分区一样了。所以嘛,如果你仅分四个以内(包括四个)的分区,我建议最好都分成主分区。

     

    4、  U盘能否分区?

    答:原先我以为U盘和硬盘一样,随意分区,和什么样的优盘没有什么关系,事实证明我错了。目前据我所知道的是,如果你优盘插入后,系统把它当作硬盘,那么恭喜你,你的优盘可以分区了(不要想当然的认为,格式化为HDD格式就可以了,其实和这个没有关系,应该和U盘里面的相关驱动程序有关系,我把一个可分区的优盘信息内容全部克隆到另一个优盘上了,事实上仅可以看到第一个分区的内容,如果你用磁盘管理程序来看该磁盘内容,你可以看到那个分区,但是不能格式化,系统提示:分区未启用)。

      

     

     

    5、  怎样直接读写硬盘指定的扇区?

    答:以前认为很复杂,其实很简单,用流函数操作即可(需要超级用户的权限)。

    CreateFileCloseHandleWriteFileReadFile四个API函数搞定,唯一区别的是,文件名称要特别设置。

    对逻辑磁盘,其文件名称为:“\\.\C:”、“\\.\D:  … … 其读写的0扇区从引导扇区开始算起(即DBR所在的扇区)。

    对物理磁盘,其文件名称为:“\\.\PhysicalDrive0、“\\.\ PhysicalDrive1  … …其读写的0扇区就是主引导记录所在的扇区。

     

    6、  什么是隐藏扇区、保留扇区?

    FAT16文件系统为例

    隐藏扇区

    保留扇区

    FAT

    根目录区

    数据区

    分区前 ß

    à分区后  文件系统开始的部分

     

    隐藏扇区可以没有,隐藏扇区第一扇区就是存放MBR(或扩展分区中虚拟MBR),保留扇区第一个扇区存放的就是引导扇区信息(DBR)。

     

    上图是我用C#做的磁盘读写程序,已经可以分区和格式化了。

     

    参考资料:

    1、《Microsoft Extensible Firmware Initiative FAT32 File System Specification V1.03,December 6,2000

    2、网友整理的《FAT文件系统原理》

     

    附记:

    学会一件东西需要有三要素:1、相关资料齐备(否则麻烦就大了,还好我们有互联网,这里向那些斩荆劈藜的先驱致敬) 2、多读、多想、多做 3、再加一点领悟能力

    什么叫悟性,看过武打小说的人对这个“悟性”这个词一定心神领会,没有悟性的人即使武林秘籍在手,也练不成绝世武功。在佛教徒里,没有“悟性”的人是成不了佛的。有些人认为悟性是天生的,和天资聪颖是一回事。

    我个人拙见,人认识和理解新事物分三个步骤,第一步把新事物和以前已知的事物进行类比,做出第一步猜想;第二、验证猜想;第三、回到第一步,继续循环,直到接近事物的本源(其实很多科学规律的就是这样发现的)。悟性和认识事物的这个过程的时间长短成反比。如果时间为一刹那,那么他就成佛了。

        做出猜想是成功的第一步,尤为重要,而这一步我认为和后天的经验有关,是可以通过学习得到的。其实很聪明,悟性很高的人,涉猎很广,对很多知识都有很强的求知欲,相关知识积累到一定层度,最后量变就引起质变。现在的原子弹不是也不用实际爆破试验了吗,通过计算机就可以模拟试验了,大大加快了研发进程(这是因为技术储备到一定层度了)。

     

    发表于 @ 2008年03月13日 10:53:00|评论(loading...)|编辑

    旧一篇: 变量溢出引发的错误

    评论

    #BlueDog 发表于2008-03-13 18:30:05  IP: 121.51.207.*
    对你用C#写的这个程序很感兴趣,能否发一份给我,谢了
    xtlxs1976@163.com
    #voodoo82 发表于2008-03-14 09:07:55  IP: 218.4.82.*
    同楼下的,如果可以的话也想要一份你程序的代码。

    刚刚在我公司设备上实现了一个支持Unicode文件名的FAT文件系统(在厂商提供的一个系统上作了完善了扩展),调试过程中使用了winhex的磁盘编辑功能,很好很强大。对你的这个程序很有兴趣。

    voodoo82@gmail.com
    #junval 发表于2008-03-17 08:49:10  IP: 218.108.29.*
    不错,,很好的文章
    #天衣有缝 发表于2008-05-11 00:23:43  IP: 58.24.118.*
    正好用的这个,感谢博主
    我的os:http://jinix.sf.net
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 叶帆