c# 读写没有文件系统的sd卡

问题描述

手头有个sd卡,想写一个字库文件到sd卡的物理扇区,非文件系统的,主要是加快下位机液晶显示速度!限于能力所限,求c#相关调用方法下面有一些参考资料,主要是想打开一个字库文件,例如AAA.BIN,然后依次读入文件并写到sd卡0磁道1扇区开始的位置(只要不占用fat文件系统的扇区即可)usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingMicrosoft.Win32.SafeHandles;usingSystem.Runtime.InteropServices;namespacewhjcns{classSDUtils{privateconstuintGENERIC_READ=0x80000000;privateconstuintGENERIC_WRITE=0x40000000;privateconstuintFILE_SHARE_READ=0x00000001;privateconstuintFILE_SHARE_WRITE=0x00000002;privateconstuintOPEN_EXISTING=3;[DllImport("kernel32.dll",SetLastError=true)]privatestaticexternSafeFileHandleCreateFileA(stringlpFileName,uintdwDesiredAccess,uintdwShareMode,IntPtrlpSecurityAttributes,uintdwCreationDisposition,uintdwFlagsAndAttributes,IntPtrhTemplateFile);privateSystem.IO.FileStream_DriverStream;privatelong_SectorLength=0;privateSafeFileHandle_DriverHandle;///<summary>///扇区数///</summary>publiclongSectorLength{get{return_SectorLength;}}///<summary>///获取磁盘扇区信息///</summary>///<paramname="DriverName">G:</param>publicSDUtils(stringDriverName){if(DriverName==null&&DriverName.Trim().Length==0)return;_DriverHandle=CreateFileA("\\.\"+DriverName.Trim(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,IntPtr.Zero,OPEN_EXISTING,0,IntPtr.Zero);_DriverStream=newSystem.IO.FileStream(_DriverHandle,System.IO.FileAccess.ReadWrite);GetSectorCount();}///<summary>///扇区显示转换///</summary>///<paramname="SectorBytes">扇区长度512</param>///<returns>EB5290......55AA</returns>publicstringByte2String(byte[]SectorBytes){if(SectorBytes==null||SectorBytes.Length!=512)return"Contentisempty";StringBuilderReturnText=newStringBuilder();intRowCount=0;for(inti=0;i!=512;i++){ReturnText.Append(SectorBytes[i].ToString("X02")+"");if(RowCount==15){ReturnText.Append("rn");RowCount=-1;}RowCount++;}returnReturnText.ToString();}///<summary>///获取扇区数///</summary>privatevoidGetSectorCount(){if(_DriverStream==null)return;_DriverStream.Position=0;byte[]ReturnByte=newbyte[512];_DriverStream.Read(ReturnByte,0,512);//获取第1扇区if(ReturnByte[0]==0xEB&&ReturnByte[1]==0x58)//DOS的好象都是32位{_SectorLength=(long)BitConverter.ToInt32(newbyte[]{ReturnByte[32],ReturnByte[33],ReturnByte[34],ReturnByte[35]},0);}if(ReturnByte[0]==0xEB&&ReturnByte[1]==0x52)//NTFS好象是64位{_SectorLength=BitConverter.ToInt64(newbyte[]{ReturnByte[40],ReturnByte[41],ReturnByte[42],ReturnByte[43],ReturnByte[44],ReturnByte[45],ReturnByte[46],ReturnByte[47]},0);}}///<summary>///读一个扇区///</summary>///<paramname="SectorIndex">扇区号</param>///<returns>如果扇区数字大于分区信息的扇区数返回NULL</returns>publicbyte[]ReadSector(longSectorIndex){//if(SectorIndex>_SectorLength)//returnnull;_DriverStream.Position=SectorIndex*512;byte[]ReturnByte=newbyte[512];_DriverStream.Read(ReturnByte,0,512);//获取扇区returnReturnByte;}///<summary>///写入数据///</summary>///<paramname="SectorBytes">扇区长度512</param>///<paramname="SectorIndex">扇区位置</param>publicvoidWriteSector(byte[]SectorBytes,longSectorIndex){if(SectorBytes.Length!=512)return;if(SectorIndex>_SectorLength)return;_DriverStream.Position=SectorIndex*512;_DriverStream.Write(SectorBytes,0,512);//写入扇区}///<summary>///关闭///</summary>publicvoidClose(){_DriverStream.Close();}}}

解决方案

解决方案二:
sd卡没有什么磁道柱面之类的概念。只有扇区,编号从0~总容量(字节数)/512-1。和硬盘一样,0扇区存储了分区表,一般默认0x10000扇区开始是第一个分区(你可以用winhex看下)对于fat32来说,分区开始是文件分配表,以及备份的文件分配表。
解决方案三:
该回复于2014-01-13 17:12:35被版主删除
解决方案四:
读写sd扇区多少有些眉目,现在怎么扩大保留扇区呢(增加出来的扇区我要物理写一些数据)?我的2gsd卡格式化完保留扇区是38个,现在怎么把他扩大成例如512个,同时还要将fat1,fat2,根目录区,数据区之类的往后挪?怎么才能实现啊!
解决方案五:
我最近也遇到了这样的问题,请问你的是怎么解决的????

时间: 2024-10-31 05:55:36

c# 读写没有文件系统的sd卡的相关文章

文件系统-关于SD卡判断最后存入的数据的位置

问题描述 关于SD卡判断最后存入的数据的位置 我用STM32实时采集大量数据存入带文件系统的SD卡,在STM32一直上电的情况,我有标志位判断SD卡中的指针指向的位置,但如果STM32掉电,标志位都复位,我要取出最新数据的信息,这时我怎么判断最新数据的地址,求大神指导,谢谢! 解决方案 数据是怎么存的,是一个文件,还是多个文件,存的时候带时间戳不?

SD卡中FAT32文件格式快速入门(图文详细介绍)

说明: MBR :Master Boot Record ( 主引导记录)  DBR :DOS Boot Record ( 引导扇区)  FAT :File Allocation Table ( 文件分配表)  硬件:本文SD卡为Kingston 4GB,FAT32格式,簇大小4KB,每扇区512字节.   第一章 硬盘结构与SD卡结构 1.1 硬盘介绍 1.1硬盘结构   如果你熟悉硬盘结构跳过本节.下图是硬盘的结构,如果你只是为了学习SD卡FAT32文件系统的话,这里你只需要注意硬盘排序结构:

《树莓派学习指南(基于Linux)》——1.4 将Raspbian烧录到SD卡

1.4 将Raspbian烧录到SD卡 树莓派学习指南(基于Linux) 将Raspbian烧录到SD卡与简单的文件复制稍有不同.我们下载的镜像文件是一份完整的SD卡内容克隆.为了完成烧录的工作,我们需要使用前面提到的一些工具. 注意 你所下载的SD卡镜像文件被打包在一个zip压缩包里.在Windows 7下,双击即可以文件夹的形式打开zip压缩包.将SD卡镜像文件复制到自己的文件夹下以备使用.在Mac OS X下,双击zip压缩包后SD卡镜像文件将会自动被解压缩到"下载"(Downl

Android 之 使用File类在SD卡中读取数据文件

Android 之 使用File类在SD卡中读取数据文件 一.File 类读写文件 :  如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置:  <!-- 在sd中创建和删除文件的权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 向SD卡中的写入权限 --&

与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

原文:与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:webabcd 介绍与众不同 windows phone 8.0 之 文件系统 通过 StorageFolder 和

Android实现读写SD卡_Android

SD卡的读写是我们在开发Android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式:    1. 获取SD卡的根目录 复制代码 代码如下: String  sdCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();    2. 在SD卡上创建文件夹目录 /** * 在SD卡上创建目录 */ public File createDirOnSDCard(String dir) { File dirF

Android编程之在SD卡上进行文件读写操作实例详解_Android

本文实例讲述了Android编程之在SD卡上进行文件读写操作的方法.分享给大家供大家参考,具体如下: 很多知识只有真正理解掌握之后才能运用自如,举一反三.对Java中的文件操作和android系统SD卡里面的文件操作,你觉得有区别吗,显然没有本质区别,如果勉强说有,那也是不足为道滴,但我们在实际运用中却要注意如下几点,不然问题会缠上你. 1.首先想要对android系统SD卡里文件操作需要添加使用权限: android系统是不会让外来程序随意动自己内存的,如果没有许可证,不好意思,不准你动我地盘

android 手机SD卡读写操作(以txt文本为例)实现步骤_Android

1.首先对manifest注册SD卡读写权限 要说明一下,我这里没有用MainActivity.class作为软件入口 复制代码 代码如下: AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com

SD卡读写,首选项,共享首选项

Android-SD卡读写 adb shell mksdkcard 50m d:\xxx\xxxx.img 挂载/卸载sd卡 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"> <!---往SDCard写入数据-> <uses-permission Android:name="android.permission.WRITE_EXTERNAL_