zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    erlang转化中文为url
    erlang中检查内存泄露
    git找回当前目录下误删的所有文件
    使用rebar编译lager,deps列表,lager要放到第一位。
    Visualizing Concurrency in Go--转
    erlang init:stop()不起效
    linux设置时间
    erlang驱动使用mysql-otp
    mysql-otp 驱动中设置utf8mb4
    erlang node time ticket
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116054.html
Copyright © 2011-2022 走看看