VC中文件操作的几种方式(3,4)
6.1.3 使用Windows API
Windows API总是显得格外沉重,表6-5是常用的文件读写操作API。
表6-5 文件读写API |
|
函数 |
含义 |
CreateFile |
创建、打开文件,返回文件句柄 |
CloseHandle |
关闭文件句柄 |
ReadFile |
从文件读取数据 |
WriteFile |
向文件写入数据 |
SetFilePointer |
设置文件读写指针 |
LockFile |
锁定文件 |
UnlockFile |
解锁文件 |
在Windows中,文件操作总是针对一个文件句柄进行的,如:
- HANDLE WINAPI CreateFile(
- __in LPCTSTR lpFileName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwShareMode,
- __in LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- __in DWORD dwCreationDisposition,
- __in DWORD dwFlagsAndAttributes,
- __in HANDLE hTemplateFile
- );
CreateFile创建一个操作文件的句柄,而其他操作则主要针对这个句柄进行。如下罗列出使用Windows API操作文件的流程。
调用CreateFile ()创建、打开文件,返回一个文件句柄。
通过文件句柄,调用ReadFile()和WriteFile()进行文件操作。
调用CloseHandle()关闭文件句柄。
该流程如图6-4所示。
图6-4 使用Windows API操作文件的流程 |
除了文件操作函数,Windows还提供了用于文件管理的API,包括对文件进行复制、删除等操作,如表6-6所示。
表6-6 文件管理API |
|
函数 |
含义 |
复制指定名称的源文件至新命名的文件 |
|
删除文件 |
|
移动文件 |
|
替换文件,并制定是否备份 |
|
获取文件的属性 |
|
获取文件的大小 |
|
获取文件的类型 |
|
获取文件的完整路径名 |
|
在指定路径下搜索满足条件的文件 |
|
查找符合指定名称的第一个文件 |
|
查找符合指定名称的下一个文件,与FindFirstFile配合使用 |
FindFirstFile()和FindNextFile()函数常常被用来配合使用,用以查找文件。它们的原型如下:
- HANDLE WINAPI FindFirstFile(
- __in LPCTSTR lpFileName,
- __out LPWIN32_FIND_DATA lpFindFileData
- );
- BOOL WINAPI FindNextFile(
- __in HANDLE hFindFile,
- __out LPWIN32_FIND_DATA lpFindFileData
- );
现在动手
编写如下程序,体验如何使用Windows API来查找C驱动器根目录下的所有目录和文件。
【程序 6-1】使用Windows API查找文件
- 01 #include "stdafx.h"
- 02 #include "windows.h"
- 03 #include "atltime.h"
- 04 #include <locale.h>
- 05
- 06 int main()
- 07 {
- 08 setlocale(LC_ALL, "chs");
- 09 WIN32_FIND_DATA FindFileData;
- 10
- 11 TCHAR FileName[] = _T("c://*.*");
- 12 //开始查找
- 13 HANDLE hFind = FindFirstFile(FileName, &FindFileData);
- 14 if(hFind != INVALID_HANDLE_VALUE)
- 15 {
- 16 while(true)
- 17 {
- 18 CTime CreationTime(FindFileData.ftCreationTime);
- 19
- 20 //是目录
- 21 if(FindFileData.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY)- 22 _tprintf(_T("<%s>/t"), FindFileData.cFileName);
- 23 else
- 24 _tprintf(_T("%s/t"), FindFileData.cFileName);
- 25
- 26 //创建时间
- 27 _tprintf(_T("/t/t%s/r/n"),
CreationTime.Format(_T("%Y年%m月%d日%H时")));- 28
- 29 if(!FindNextFile(hFind, &FindFileData))
- 30 break;
- 31 }
- 32 FindClose(hFind);
- 33 }
- 34
- 35 return 0;01 }
运行结果如图6-5所示,它列出了"C:/"根目录下的所有文件及目录。
图6-5 运行结果 |
光盘导读
该项目对应于光盘中的目录"/ch06/FileApiTest"。
6.1.4 使用MFC::CFile
使用HANDLE操作文件显得有点陈腐,CFile封装了Windows系统对文件的操作。可以使用如下语句构造CFile对象:
- CFile( );
- CFile(
- HANDLE hFile //文件句柄
- );
- CFile(
- LPCTSTR lpszFileName, //文件名
- UINT nOpenFlags //文件打开方式
- );
其中,参数nOpenFlags可能的取值如表6-7所示。
表6-7 CFile文件打开方式 |
|
标志 |
含义 |
CFile::modeCreate |
创建新文件,如果文件已存在, 则将其长度变成0 |
CFile::modeNoTruncate |
与modeCreate组合使用,如果文 件已存在,则不会将其长度变成0 |
CFile::modeRead |
以只读方式打开文件 |
CFile::modeReadWrite |
以读写方式打开文件 |
(续表)
标志 |
含义 |
CFile::modeWrite |
以只写方式打开文件 |
CFile::modeNoInherit |
组织该文件被子项继承 |
CFile::shareDenyNone |
以共享模式打开文件,不会禁止其他进程对文件的读写 |
CFile::shareDenyRead |
禁止其他进程对文件的读操作 |
CFile::shareDenyWrite |
禁止其他进程对文件的写操作 |
CFile::shareExclusive |
以独占模式打开文件,禁止其他进程对文件的读写 |
CFile::typeText |
以文本方式打开文件 |
CFile::typeBinary |
以二进制方式打开文件 |
此外,CFile提供了一些常用的操作函数,如表6-8所示。
表6-8 CFile操作函数 |
|
函数 |
含义 |
Open |
打开文件 |
Close |
关闭文件 |
Flush |
刷新待写的数据 |
Read |
从当前位置读取数据 |
Write |
向当前位置写入数据 |
GetLength |
获取文件的大小 |
Seek |
定位文件指针至指定位置 |
SeekToBegin |
定位文件指针至文件头 |
SeekToEnd |
定位文件指针至文件尾 |
GetFileName |
获取文件名,如:“NOTEPAD.EXE” |
GetFilePath |
获取文件路径,如:“C:/WINDOWS /NOTEPAD.EXE” |
GetFileTitle |
获取文件标题,如:“NOTEPAD” |
GetPosition |
获取当前文件指针 |
GetStatus |
获取当前文件的状态,返回一个CFileStatus |
#Remove |
静态方法,删除指定文件 |
#Rename |
静态方法,重命名指定文件 |
注意最后两个静态函数,其实它们封装了Windows API中关于文件管理的函数。
使用CFile操作文件的流程如下:
构造一个CFile对象。
调用CFile::Open()函数创建、打开指定的文件。
调用CFile::Read()和CFile::Write ()进行文件操作。
调用CFile::Close()关闭文件句柄。
====未完待续====
以上摘自《把脉VC++》第6.1小节的内容 ,转载请注明出处。
如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533
如本文存在任何侵权部分,请及时告知,我会第一时间删除!
转载本博客原创文章,请附上原文@cnblogs的网址!
QQ: 5854165 我的开源项目 欢迎大家一起交流编程架构技术&大数据技术! +++++++++++++++++++++++++++++++++++++++++++