指引网

当前位置: 主页 > 编程开发 > .NET >

FAT文件系统实现探索

来源:网络 作者:佚名 点击: 时间:2017-11-17 03:52
[摘要] 由于目前.Net Micro Framework并不支持P/Invoke功能(也无法像WinCE一样开发流式驱动),所以在底层在驱动层面用C直接对存储器(Flash)进行文件系统开发是行不通的。幸好.Net Micro Framework提供了Ext

    由于目前.Net Micro Framework并不支持P/Invoke功能(也无法像WinCE一样开发流式驱动),所以在底层在驱动层面用C直接对存储器(Flash)进行文件系统开发是行不通的。幸好.Net Micro Framework提供了ExtendedWeakReference类,其中赋值Target对象可以把数据存放到存储器上(Flash)。
[Serializable]
        private class FlashDatas
        {
            //调入数据
            public static byte[] Load(uint index)
            {
                ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate(
                        typeof(FlashDatas),                       //类型,任意类都可以,其名称起到一个索引作用
                        index,                                    //ID号,这个数据比较有用,不同ID号代表不同数据
                        ExtendedWeakReference.c_SurviveBoot);//该标志和.c_SurviveBoot 区别不大
                return ewr.Target as byte[];
            }        
 
            //保存数据
            public static void Save(uint index, byte[] data)
            {
                ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate(typeof(FlashDatas), index, ExtendedWeakReference.c_SurviveBoot);
                ewr.Target = data;
            }
    }

    上面的代码就是ExtendedWeakReference类的具体使用,从代码可以看出我们无法直接对存储器进行读写,只能通过保存类的方式对数据进行存储,至于该数据存放到何处,那是无从得知的。
    我最初的想法是定义一个类,类中定义一个大数组,不过实际调试发现,该数组不能太大,超过几十K就会出现内存溢出。幸好该对象可以是字节数组,所以我产生了另一个想法,每次保存一个512字节大小的字节数组,相当于磁盘上的一个扇区,以此为存取的最小单位,实现FAT文件系统。
    我们知道要实现FAT16系统一般至少需要4M存储空间,实现FAT32一般需要256M空间以上。所以我简单的做了一个程序,在实际硬件中测试一下存取1024*4个512字节的数组内存是否可行。
测试代码如下:
       private const uint SectorSize=512;   //扇区大小
        private const uint SecPerClus = 4;   //一个簇包含的扇区数

 public static void Main()
        { 
            Debug.Print("Start");
            for (uint i = 0; i < 512; i++)    //1024*4
            {
                byte[] bytData = new byte[SectorSize];
                bytData[0] = (byte)(i % 256);
                bytData[bytData.Length - 1] = bytData[0];
                FlashDatas.Save(i, bytData);
               Debug.Print(i.ToString() + " Save " + bytData[0].ToString() + " " + bytData[bytData.Length - 1].ToString());
 
                //byte[] bytData = FlashDatas.Load(i);
                //if (bytData == null)
                //{
                //    Debug.Print(i.ToString() + " Load Error");
                //    break;
                /

------分隔线----------------------------