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

6.1.3  使用Windows API

Windows API总是显得格外沉重,表6-5是常用的文件读写操作API。

6-5  文件读写API

函数

含义

CreateFile

创建、打开文件,返回文件句柄

CloseHandle

关闭文件句柄

ReadFile

从文件读取数据

WriteFile

向文件写入数据

SetFilePointer

设置文件读写指针

LockFile

锁定文件

UnlockFile

解锁文件

在Windows中,文件操作总是针对一个文件句柄进行的,如:

  1. HANDLE WINAPI CreateFile(  
  2.   __in          LPCTSTR lpFileName,  
  3.   __in          DWORD dwDesiredAccess,  
  4.   __in          DWORD dwShareMode,  
  5.   __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes,  
  6.   __in          DWORD dwCreationDisposition,  
  7.   __in          DWORD dwFlagsAndAttributes,  
  8.   __in          HANDLE hTemplateFile  
  9. ); 

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()函数常常被用来配合使用,用以查找文件。它们的原型如下:

  1. HANDLE WINAPI FindFirstFile(  
  2.   __in          LPCTSTR lpFileName,  
  3.   __out         LPWIN32_FIND_DATA lpFindFileData  
  4. );  
  5.  
  6. BOOL WINAPI FindNextFile(  
  7.   __in          HANDLE hFindFile,  
  8.   __out         LPWIN32_FIND_DATA lpFindFileData  
  9. ); 

现在动手

编写如下程序,体验如何使用Windows API来查找C驱动器根目录下的所有目录和文件。

【程序 6-1】使用Windows API查找文件

  1. 01  #include "stdafx.h" 
  2. 02  #include "windows.h" 
  3. 03  #include "atltime.h" 
  4. 04  #include <locale.h>  
  5. 05    
  6. 06  int main()  
  7. 07  {  
  8. 08      setlocale(LC_ALL, "chs");  
  9. 09      WIN32_FIND_DATA FindFileData;  
  10. 10    
  11. 11      TCHAR FileName[] = _T("c://*.*");  
  12. 12      //开始查找  
  13. 13      HANDLE hFind = FindFirstFile(FileName, &FindFileData);  
  14. 14      if(hFind != INVALID_HANDLE_VALUE)  
  15. 15      {  
  16. 16          while(true)  
  17. 17          {  
  18. 18              CTime CreationTime(FindFileData.ftCreationTime);  
  19. 19                
  20. 20              //是目录  
  21. 21              if(FindFileData.dwFileAttributes
    & FILE_ATTRIBUTE_DIRECTORY)  
  22. 22                  _tprintf(_T("<%s>/t"), FindFileData.cFileName);  
  23. 23              else 
  24. 24                  _tprintf(_T("%s/t"), FindFileData.cFileName);  
  25. 25                
  26. 26              //创建时间  
  27. 27              _tprintf(_T("/t/t%s/r/n"), 
    CreationTime.Format(_T(
    "%Y年%m月%d日%H时")));  
  28. 28    
  29. 29              if(!FindNextFile(hFind, &FindFileData))  
  30. 30                  break;  
  31. 31          }  
  32. 32          FindClose(hFind);  
  33. 33      }  
  34. 34    
  35. 35      return 0;01 } 

运行结果如图6-5所示,它列出了"C:/"根目录下的所有文件及目录。

 
图6-5  运行结果

光盘导读

该项目对应于光盘中的目录"/ch06/FileApiTest"。

6.1.4  使用MFC::CFile

使用HANDLE操作文件显得有点陈腐,CFile封装了Windows系统对文件的操作。可以使用如下语句构造CFile对象:

  1. CFile( );  
  2. CFile(  
  3.    HANDLE hFile             //文件句柄  
  4. );  
  5. CFile(  
  6.    LPCTSTR lpszFileName,    //文件名  
  7.    UINT nOpenFlags          //文件打开方式  
  8. ); 

其中,参数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

原文地址:https://www.cnblogs.com/bluejoe/p/5116053.html