您的位置:首页 > 其它

Widows 文件操作和内存映射

2008-05-02 14:22 288 查看
Widows 文件操作和内存映射
1. 创建和读写文件
CreateFile是一个功能相当强大的函数,Widows下的底层设备都由它打开,它可以创建和打开文件,目录,物理磁盘,控制台缓冲区,邮槽和管道等。调用成功后,函数返回能够用来访问此对象的句柄。其原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName, // 要创建和打开的对象的名称
DWORD dwDesiredAccess, // 文件的存取方式
DWORD dwShareMode, //共享的属性
LPSECURITY-ATTRIBUTES lpSecurityAttributes, // 安全属性
DWORD dwCreationDisposition, //文件存在和文件不存在时系统采取的行动
DWORD dwFlagAndAttributes, // 新文件的属性
HANDLE hTemplateFile // 一个文件模块的句柄
);
各参数的含义:
1) lpFileName参数是要创建或打开的对象的名称。如果要打开文件,直接在这里指定文件名称即可,如果操作对象是第一个串口,则要指定“COM1”为文件名,然后就可以像操作文件一样操作串口了,如果要打开本地电脑上的一个服务,要以“、、。、服务名称”为文件名,其中的“。”代表本地的机器;也可以使用CreateFile打开网络中其他主机上的文件,此时的文件名应该是“、、主机名、共享目录、文件名”。
2) dwDesiredAccess参数是访问的方式,它指定了要对打开的对象进行何种操作。指定GENERIC_READ标志表示以只读方式打开,指定GENERIC_WRITE标志表示以只写方式打开,指定这俩个值得组合,表示要同时对打开的文件的对象进行读写操作。
3) dwShareMode参数指定了文件对象的共享的模式。表示文件打开后是否允许其他代码以那种方式再次打开这个文件,它可以是下列值得组合:
0 :不允许文件再被打开。C语言中的fopen函数就是这样打开文件的。
FILE_SHARE_DELETE: 允许以后的程序代码对文件删除文件(Win98系统不支持这个标志)
FILE_SHARE_READ: 允许以后的程序代码以读的方式打开文件。
FILE_SHARE_WRITE:允许以后的程序代码以写的方式打开文件。

4) dwCreationDisposition参数指定了当文件已存在或者不存在时系统采取的动作,
在这里设置不同的标志就可以决定究竟是要打开文件,还是要创建文件。参数的可能取值如下:
CREATE_ALWAYS 创建新文件。如果文件存在,函数会覆盖这个文件,清除存在的属性。
CREATE_NEW 创建新文件。如果文件存在,函数执行失败。
OPEN_ALWAYS 如果文件已经存在,就打开它,不存在就创建新的文件。
OPEN_EXISTING 打开存在的文件,如果文件不存在,函数执行失败。
TRUNCATE_EXISTING 打开文件并将文件截断为零,当文件不存在时函数执行失败。

5) dwFlagAndAttributes参数用来指定新建文件的属性和标志。文件属性可以是下面这些值得组合:
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_HIDDEN 标记隐藏属性
FILE_ATTRIBUTE_READONLY 标记只读属性
FILE_ATTRIBUTE_TEMPORARY 临时文件

此参数还可以同时指定对文件的操作方式。下面是一些比较常用的方式:
FILE-FLAG_DELETE_ON_CLOSE 文件关闭后系统立即自动删除。
FILE-FLAG_OVERLAPPED 使用异步读写文件的方式。
FILE-FLAG_THROUGH 系统不会对文件使用缓存,文件的任何改变都会写到硬盘中。
6)
hTemplateFile参数指定了一个文件模板句柄,系统会复制文件模板的所有属性到当前创建的文件中,WIN98不支持,必须设为空。
打开文件成功或创建文件成功时,函数返回文件的句柄。失败时返回INVALID_HANDLE_VALUE(-1),如果想了解失败的原因,可以继续调用GETLASTRERROR函数。
下面的代码
为读取数据打开一个存在的文件
HANDLE hFile;
hFile=::CreateFile(“myfile.txt”, //要打开的文件
CENERIC_READ,//要读这个文件
FILE_SHARE_READ,//允许其他的程序以只读的形式再次打开
NULL,//默认的安全属性
OPEN_EXISTING,// 仅仅打开存在的文件
FILE_ATTRUBUTE_NORMAL,//普通文件
NULL); // 没有模板
If (hFile==INVALID_HANDLE_VALUE)
{
}

要关闭打开的文件,直接以返回的文件句柄调用CloseHandle函数即可。

2. 移动文件的指针
系统为每个打开的文件维护一个文件指针,指定对文件的下一个读写操作从什么位置开始。随着数据的读出或写入,文件指针也随之移动。当文件刚打开时,文件指针处于文件的头部,有时候需要随机读取文件的内容,这就需要先调整文件指针,SetFilePointer函数提供了这个功能,
DWORD SetFilePointer (
HANDLE hFile;//文件句柄
LONG IDistanceToMove,//要移动的距离
PLONG lpDistanceToMoveHigh,// 移动的距离高为32位,一般设置为空。
DWORD dwMoveMethod//移动的模式
);
lpDistanceToMove参数指明了要从什么地方开始移动,可以是下面的一个值:
FILE-BEGIN:开始移动的位置为0。即从文件的头部开始移动。
FILE-CURRENT :开始移动的位置是文件指针的当前值。
FILE-END:开始移动的位置是文件的末尾。
函数执行失败返回-1,否则返回新的文件指针的位置。
SetEndOfFile
BOOL SetEndOfFile(HANDLE hFile)//此函数可以用来截断或者扩展文件。

3. 读写文件
读写文件的函数是ReadFile,WriteFile,这二个函数可以同步读写文件,也可以异步读写文件。但是ReadFileEx,WriteFileEx只能异步读写文件。
函数如下:
BOOL ReadFile(
HANDLE hFile; //文件句柄
LPVOID lpBuffer;//指向一个缓冲区,函数会将读出的数据返回到这里。
DWORD nNumberOfBytesToRead,// 要求读入的字节数
LPDWORD lpNumberOfBytesToRead,//指向一个DWORD类型的变量
LPOVERLAPPED lpOverlapped // 以便设为空

)
BOOL WriteFile(hFile,lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesToWrite,lpOverlapped);
4. 锁定文件
当对文件的数据的一致性要求较高时,为了防止程序在写入的过程中其他的进程刚好在读取写入区域中的内容,可以对已打开的文件的此部分进行加锁,就可以防止其他进程对该区域进行读取。
加锁和解锁的函数是LockFile,unLockFile
BOOL LockFile(
HANDLE hFile;//文件句柄
DWORD dwFileOffserLow;//加锁的开始位置
DWORD dwFileOffsetHigh,
DWORD nNumberOfBytesToLockLow,// 加锁的区域大小
DWORD nNumberOfBytesToLockHigh
);
UnLockFile(hFile, dwFileOffserLow, dwFileOffsetHigh, nNumberOfBytesToUnLockLow, nNumberOfBytesToUnLockHigh)

dwFileOffserLow和dwFileOffsetHigh参数组合起来指定了加锁区域的开始位置,nNumberOfBytesToLockLow和nNumberOfBytesToLockHigh参数组合起来指定了加锁区域的大小,这二个参数都指定了64位的值,在WIN32中只使用32位。
如果加锁的文件的进程终止,或者是文件关闭时还未解锁,操作系统会自动解除对文件的锁定。但是,操作系统解锁文件花费的时间取决于当前可用的系统资源。因此,进程终止时最好显示地解锁所有锁定的文件,以免造成文件无法访问。

5. 获取文件的信息
1) 获取文件的类型
WINDOWS下的许多对象都称作文件。如果想知道一个文件的句柄就要通过函数GetFileType,原型如下:
DWORD GetFileTyp (HANDLE hFile);
函数的返回值是下面的一个值:
FILE_TYPE_CHAR //指定的文件是字符文件,通常是设备或控制台
FILE_TYPE_DISK //指定的文件是磁盘文件
FILE_TYPE_PIPE //指定的文件是套节子,一个命名的管道或未命名的管道
FILE_TYPE_UNKNOWN// 不能识别的文件,或函数调用失败。
2) 获取文件的大小
如果确定使用的文件是磁盘文件,还可以使用函数GetFileSize取得文件的长度
DWORD GetFileSize(
HANDLE hFile;//文件的句柄
LPDWORD lpFileSizeHigh// 用于返回文件长度的高字,可以指定为NULL
);
函数执行成功,返回文件长度的低双字节,如果lpFileSizeHigh参数不为NULL,函数将文件大小的高双字节放入它指向的DWORD的变量中。
如果函数执行失败。并且lpFileSizeHigh参数为NULL,返回值将是INVALID_FILE_SIZE. lpFileSizeHigh参数不为NULL, 返回值将是INVALID_FILE_SIZE.
3) 获取文件属性
如果要查看文件或者目录的属性,可以使用函数GetFileAttributes,它会返回一系列的值:
DWORD GetFileAttributes(LPCTSTR lpFileName) lpFileName//指定文件名或目录名
FILE_ATTRIBUTES_ARCHIVE // 文件包含归档属性
FILE_ATTRIBUTES_COMPRESSED// 文件和目录被压缩
FILE_ATTRIBUTES_DIRECTORY//这是一个目录
FILE_ATTRIBUTES_HIDDEN//文件包含隐含属性
FILE_ATTRIBUTES_NORMAL//文件没有其他属性
FILE_ATTRIBUTES_READONLY//文件包含只读属性
FILE_ATTRIBUTES_SYSTEM//文件包含系统属性
FILE_ATTRIBUTES_TEMPORARY T//文件是一个临时文件
下面是一个检查文件或目录是否存在的自定义函数
BOOL FileExists(LPCTSTR lpszFileName,BOOL blsDirCheck)
{
DWORD dwAttributes = GetFileAttributes(lpszFileName);
If (dwAttributes)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: