[CE编程]第7章 Files, Databases, and the Registry (-)文件系统

原创 2004年11月02日 19:41:00
其他OS(XP,WIN ME)都是在磁盘(软盘,硬盘)上存储的, Windows CE实现了一个唯一的基于RAM的文件系统,就是传说中的  object store.在实现中,对象存储更象一个数据库,而不是一个对磁盘分配的系统。 还好,对于程序员来说,win32 API掩盖了这一切。
数据库API是CE独有的,不要和SQL CE混淆了。

所以现在你不能看什么簇,卷......这些概念都没有了,尽管你看起来那些在ROM中的东西象是一个个文件。
还有,在其他WINDOWS系统中很重要的current directory概念在CE中也荡然无存。文件必须由全路径标示。
CE中也不支持deep application-level security available under Windows XP。在Win32 API中所有的security的参数全部传NULL。


FileSys.exe 由下列几个组件组成:

• ROM 文件系统

• 存储管理器

• 对象存储


对象存储是一个内存堆,由 FileSys.exe 控制。对象存储包含 RAM 系统注册表、RAM 文件系统和属性数据库。它们都是 FileSys.exe 模块的可选组件。RAM 文件系统和属性数据库是完全可选的,并且在某些系统中可以根本不存在。对每个 Windows CE 设备来说,以某些形式存在的注册表是必需的。直到 Windows CE 的 4.0 版本,它总是驻留在对象存储中。使用 Windows CE .NET,它可以作为文件存在于外部装入的文件系统(例如磁盘)中。随后,我们将了解注册表和文件系统是如何产生联系的。

基于 RAM 的文件系统通常连接到呈现给应用程序的统一文件系统的根。就是说,文件“/MyFile.txt”位于统一系统的根和 RAM 文件系统的根中。ROM 文件系统连接到统一文件系统中的“/Windows”文件夹。这意味着,ROM 中的所有 文件均可作为“/Windows”文件夹中的只读文件来访问。


摘自  《理解 Windows CE .NET 中的文件系统体系结构 》


http://www.microsoft.com/china/MSDN/library/windev/WindowsCE/art/embedded06172003_fig1.gif


pc.gifWinCE文件系统:



star.gif创建和打开文件:
HANDLE CreateFile (LPCTSTR lpFileName,                 //所要创建的文件名    
                   DWORD dwDesiredAccess,             //GENERIC_WRITE允许写,GENERIC_READ读
                   DWORD dwShareMode,                 //其他进程对其的权限FILE_SHARE_READ,FILE_SHARE_WRITE  
                   LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全参数,NULL    
                   DWORD dwCreationDistribution,         //打开或者创建文件的方式
                   DWORD dwFlagsAndAttributes,             //文件属性
                   HANDLE hTemplateFile);            //在CE中被忽略,被设置为0.
star.gif读和写文件:
1.读函数:
BOOL      ReadFile  (HANDLE hFile,                                     //打开文件的句柄    
                                   LPVOID lpBuffer,                                    //读文件所要接受的数据的缓冲区    
                                   DWORD nNumberOfBytesToRead,    
                                   LPDWORD lpNumberOfBytesRead,
                                   LPOVERLAPPED lpOverlapped);        //CE中不支持overlapped file operations,所以为NULL      

2.写函数:
BOOL WriteFile (HANDLE hFile, LPCVOID lpBuffer,
                DWORD nNumberOfBytesToWrite,
                LPDWORD lpNumberOfBytesWritten,
                LPOVERLAPPED lpOverlapped);

star.gif移动文件指针:
//概念未理清

star.gif关闭文件:
BOOL  CloseHandle   (HANDLE  hObject );            //关闭成功,返回TRUE,失败,调用GetLastError()返回失败原因

star.gif裁减文件:?
//概念未理清

star.gif获取文件信息:

当然你也可以:
BOOL SetFileAttributes (LPCTSTR lpFileName, DWORD dwFileAttributes);




























































star.gif文件时间:
标准的Win32 API有3种文件时间:
文件创建时间,文件最后访问时间,文件最后修改时间。
BOOL GetFileTime (HANDLE hFile, LPFILETIME lpCreationTime, 
                  LPFILETIME lpLastAccessTime,
                  LPFILETIME lpLastWriteTime);
这个函数用来获取文件时间。3个指针是指向要接受时间的FILETIME结构。如果你只对其中部分时间感兴趣,其他时间的指针就设置为NULL。

When the file times are queried for a file in the object store, Windows CE copies the last write time into all FILETIME structures. This goes against Win32 documentation, which states that any unsupported time fields should be set to 0. For the FAT file system used on storage cards, two times are maintained: the file creation time and the last write time. When GetFileTime is called on a file on a storage card, the file creation and last write times are returned and the last access time is set to 0.


BOOL FileTimeToSystemTime (const FILETIME *lpFileTime, 
                           LPSYSTEMTIME lpSystemTime);
将一个FILETIME结构转变为一个SYSTEMTIME结构
Note:SYSTEMTIME结构里已经格式化了时间。




BOOL FileTimeToLocalFileTime (const FILETIME *lpFileTime,
                              LPFILETIME lpLocalFileTime);

同样,你也可以:

BOOL SetFileTime (HANDLE hFile, const FILETIME *lpCreationTime,
                  const FILETIME *lpLastAccessTime, 
                  const FILETIME *lpLastWriteTime);

记住:文件时间必须是UTC时间,而不是本地时间。

不过以上仅仅只是在Win32下的,在CE中,修改时间的话,所有的3个时间参数都将被设置。如果有多个时间被设置的话,
那么最后一个设置的时间将设置3个参数;读也是一样的,CE将最后修改的时间放到所有的FILETIME结构中。
star.gif文件大小和其他信息:
这样获得一个文件的大小:
DWORD GetFileSize (HANDLE hFile, LPDWORD lpFileSizeHigh);
如果你不想文件大小超过4G的话,第2个参数设为NULL。
如果你还想多知道点的话,下面这个函数怎么样?tongue_smile.gif
BOOL GetFileInformationByHandle (HANDLE hFile, 
                   LPBY_HANDLE_FILE_INFORMATION lpFileInformation);


typedef struct _BY_HANDLE_FILE_INFORMATION { 
    DWORD dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWriteTime; 
    DWORD dwVolumeSerialNumber; 
    DWORD nFileSizeHigh; 
    DWORD nFileSizeLow; 
    DWORD nNumberOfLinks; 
    DWORD nFileIndexHigh; 
    DWORD nFileIndexLow; 
    DWORD dwOID; 
} BY_HANDLE_FILE_INFORMATION;


2004年11月2日21:03:26








[CE编程]第7章 Files, Databases, and the Registry (二)CE中的数据库API

                                                                CE中的数据库API           CE提供了一套唯一的(只能在C...
  • songtitan
  • songtitan
  • 2004年11月03日 17:47
  • 1599

c++ Primer Plus(第六版)第七章习题,写代码之路

c++ Primer Plus(习题7.1) //用户输入啷个数,返回调和平均数 //其中一个为0结束程序 #include using namespace std; double t_averag...
  • Robot_x
  • Robot_x
  • 2017年01月20日 11:53
  • 414

Java - Thinking in Java 第7章 习题

1/** * 惰性初始化 * * Created by wang on 15/8/6. */ class Init { public Init() { System....
  • u012515223
  • u012515223
  • 2015年08月20日 07:14
  • 2177

ACCPHTMLS1第七章上机练习1

无标题文档 li{ list-style-type:none; width:100px; float:left; } a{ background:url(../Desktop/forumMenu...
  • baidu_36074048
  • baidu_36074048
  • 2016年10月19日 14:58
  • 702

Remote Registry Editor使用

版权:研博科技  作者:Bill Zhong  日期:2007-7-3(转载请标明出处)  Remote Registry Editor介绍:连接目标设备上WinCE的Registry内容:用Remo...
  • lzyzuixin
  • lzyzuixin
  • 2009年02月21日 00:15
  • 1592

javascript语言精粹笔记 5-7章

继承基于类的语言中,继承有两个好处 1、代码重用。2、包括了一套类型系统的规范。 js是基于原型的弱类型语言,它可以模拟基于类的模式,也可以用其他模式。伪类js不让对象直接从其他对象继承,反而插入...
  • kofforever
  • kofforever
  • 2017年02月08日 11:48
  • 97

CE第八步的详细讲解(配图),已完全通关

CE第八步的详细讲解(配图) 已经学到第八步的人已经都知道如何查一个value的address了,所以查address的那一步省略,直接查出了第一个pointer 大家可以看到这里的指令是 move[...
  • tavor
  • tavor
  • 2008年10月20日 22:48
  • 4303

C++Primer第五版 第七章习题答案(1~10)

1:知识点1:类的定义方法:struct和class两种方法的用法和区别。 知识点2:类内成员的初始化方法:成员初始化列表。编译器会调用构造函数初始化成员,可以被重载。 首先举个例子方便于理解: ...
  • misayaaaaa
  • misayaaaaa
  • 2017年02月16日 08:52
  • 3629

C++沉思录读书笔记(7章)-句柄:第二部分

上一回讨论的句柄技术有一个明显的缺点:为了将句柄捆绑到类T的对象上,必须要新定义一个具有类型为T的成员对象的新类。 这个毛病相当麻烦,如果想新设计一个类的句柄类,就需要新定义两个类。 ...
  • yucan1001
  • yucan1001
  • 2011年10月30日 22:12
  • 678

《道德经》第七章

天長地久。天地所以能長且久者,以其不自生,故能長生。 是以圣人后其身而身先;外其身而身存。非以其無私邪?故能成其私。 【易解】 天长地久。天地所以能够长久,是因为它们不去强求一种非其不可的...
  • tskpcp
  • tskpcp
  • 2017年02月13日 10:16
  • 121
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[CE编程]第7章 Files, Databases, and the Registry (-)文件系统
举报原因:
原因补充:

(最多只允许输入30个字)