CSDN博客

img songtitan

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

发表于2004/11/2 19:41:00  909人阅读

其他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


WinCE文件系统:



创建和打开文件:
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.
读和写文件:
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);

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

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

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

获取文件信息:
DWORD GetFileAttributes (LPCTSTR lpFileName);

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




























































文件时间:
标准的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结构中。
文件大小和其他信息:
这样获得一个文件的大小:
DWORD GetFileSize (HANDLE hFile, LPDWORD lpFileSizeHigh);
如果你不想文件大小超过4G的话,第2个参数设为NULL。
如果你还想多知道点的话,下面这个函数怎么样?
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








0 0

相关博文

我的热门文章

img
取 消
img