FindFirstFile()函数

来源:互联网 发布:javaee和java的区别 编辑:程序博客网 时间:2024/05/10 05:40

FindFirstFile()函数

函数功能描述:查找指定目录的第一个文件或目录并返回它的句柄

函数原型 :
          HANDLE FindFirstFile(
                                LPCTSTR lpFileName,                       // 目录名
                                LPWIN32_FIND_DATA lpFindFileData   // 数据缓冲区
                              );

参数:

lpFileName
[输入] 指向字符串的指针用于指定一个有效的目录。

lpFindFileData
[输出] 指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。

返回值:
如果成功,则返回找到文件或目录的句柄。在FindNextFile和FindClose函数中会用到此句柄。
如果失败,返回INVALID_HANDLE_VALUE。要获得更多的信息调用GetLastError函数。

备注:
指定目录的形式应该为"..//abc//*.*"   就是在abc目录中找第一个文件或目录。
WIN32_FIND_DATA的结构中包含很多文件或目录的有用信息,后面的程序或许会用到。该结构如下:

[cpp] view plain copy
  1. typedef struct _WIN32_FIND_DATA  
  2. {  
  3.     DWORD dwFileAttributes;            // 文件属性  
  4.     FILETIME ftCreationTime;           // 文件创建时间  
  5.     FILETIME ftLastAccessTime;         // 文件最后一次访问时间  
  6.     FILETIME ftLastWriteTime;          // 文件最后一次修改时间  
  7.     DWORD nFileSizeHigh;               // 文件长度高32位  
  8.     DWORD nFileSizeLow;                // 文件长度低32位  
  9.     DWORD dwReserved0;                 // 系统保留  
  10.     DWORD dwReserved1;                 // 系统保留  
  11.     TCHAR cFileName[ MAX_PATH ];       // 长文件名  
  12.     TCHAR cAlternateFileName[ 14 ];    // 8.3格式文件名  
  13. }WIN32_FIND_DATA, *PWIN32_FIND_DATA;  




使用环境:
windows nt 3.1 和以后都可以使用
windows 95 和以后都可以使用
头文件   windows.h
使用     Kernel32.lib    库

[cpp] view plain copy
  1. #include "windows.h"  
  2.   
  3. int main(int argc, char *argv[])  
  4. {  
  5.    WIN32_FIND_DATA FindFileData;  
  6.    HANDLE hFind;  
  7.   
  8.    printf ("Target file is %s./n", argv[1]);  
  9.   
  10.    hFind = FindFirstFile(argv[1], &FindFileData);     //注意目录的形式后面要有*.*  
  11.   
  12.    if (hFind == INVALID_HANDLE_VALUE) {  
  13.      printf ("Invalid File Handle. Get Last Error reports %d/n", GetLastError ());  
  14.    } 
  15.   else {  
  16.      printf ("The first file found is %s/n", FindFileData.cFileName);  
  17.      FindClose(hFind);  
  18.    }  
  19.   
  20.    return (0);  
  21. }  

 

 

 

 

 

 其他信息:

 

 

下文讲述了在Visual C++ 下编程实现对磁盘文件的属性进行获取以及更改的一般方法,并给出部分相关的关键代码。  

 

 

 一、 引言

文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创建、读取和写入文件。对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间等等进行提取处理与重新设置。

 

 

  

二、 WIN32_FIND_DATA结构

关于文件的全部属性信息,总计有以下以下9种:

文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。

 

在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。

 

在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。

 

 

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:

WIN32_FIND_DATA ffd;
HANDLE hFind = FindFirstFile("c:test.dat", &ffd);

 

在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。

 

 

 

 

三、 文件属性信息的获取与更改

 

为了更好的保存获取到的文件属性信息,对应于文件属性构造一个自定义的FILE_INFO数据结构,获取的属性信息可暂存于此:

[cpp] view plain copy
  1. typedef struct _FILE_INFO  
  2. {  
  3.     TCHAR szFileTitle[128];         // 文件的标题名  
  4.     DWORD dwFileAttributes;         // 文件的属性  
  5.     FILETIME ftCreationTime;        // 文件的创建时间  
  6.     FILETIME ftLastAccessTime;      // 文件的最后访问时间  
  7.     FILETIME ftLastWriteTime;       // 文件的最后修改时间  
  8.     DWORD nFileSizeHigh;            // 文件大小的高位双字  
  9.     DWORD nFileSizeLow;         // 文件大小的低位双字  
  10.     DWORD dwReserved0;          // 保留,为0  
  11.     DWORD dwReserved1;          // 保留,为0  
  12. }FILE_INFO, * PFILE_INFO;  

 

 

首先用FindFirstFile()函数将文件属性获取到WIN32_FIND_DATA 结构对象FindFileData中去,之后可以用FindClose()将其关闭,并把FindFileData中的有关文件属性信息的内容复制到自定义结构FILE_INFO的结构对象FileInfo中备用。下面是关于这部分描述的部分关键代码:

[cpp] view plain copy
  1. FILE_INFO FileInfo;  
  2. WIN32_FIND_DATA FindFileData;  
  3.   
  4. // ……  
  5.   
  6. FindClose(FindFirstFile("Test.txt",&FindFileData));  
  7. memset(&FileInfo, 0,sizeof(FILE_INFO));  
  8.   
  9. // ……  
  10.   
  11. //将文件属性信息保存到FileInfo中备用  
  12. strcpy(FileInfo.szFileTitle, myFile.GetFileTitle());  
  13. FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;  
  14. FileInfo.ftCreationTime = FindFileData.ftCreationTime;  
  15. FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;  
  16. FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;  
  17. FileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;  
  18. FileInfo.nFileSizeLow = FindFileData.nFileSizeLow;  
  19.   
  20. // ……  

 

在获取到文件的原始属性信息后既可以原封不动的将属性重新写到文件,也可以对其中某一项或某几项属性内容进行修改后再行写入文件,从而达到更改文件属性的目的。比如可以用SetFileTime()函数设置文件的创建时间、最近一次访问时间以及最近一次修改的时间等等:

SetFileTime((HANDLE)destFile.m_hFile, // 待写入的文件句柄

&FileInfo.ftCreationTime,                    // 文件的创建时间

&FileInfo.ftLastAccessTime,                // 文件最近一次的访问时间

&FileInfo.ftLastWriteTime);                // 文件最近一次的修改时间

 

也可以用SetFileAttributes()函数实现对文件属性的修改:

SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);

 

至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。

 

 

小结:

本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。用此技术可以在通讯等对文件有严格要求的应用领域实现文件全部信息(包括文件内容、文件名以及文件属性等)的完整传送。本文所述程序在Windows 98下由Microsoft Visual C++ 6.0编译调试通过。

0 0
原创粉丝点击