您的位置:首页 > 其它

VC中文件操作的几种方式(3,4)

2009-09-01 08:53 453 查看
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

函数

含义

CopyFile

复制指定名称的源文件至新命名的文件

DeleteFile

删除文件

MoveFile

移动文件

ReplaceFile

替换文件,并制定是否备份

GetFileAttributes

获取文件的属性

GetFileSize

获取文件的大小

GetFileType

获取文件的类型

GetFullPathName

获取文件的完整路径名

SearchPath

在指定路径下搜索满足条件的文件

FindFirstFile

查找符合指定名称的第一个文件

FindNextFile

查找符合指定名称的下一个文件,与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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: