查找指定目录的第一个文件或目录并返回它的句柄——FindFirstFile

 

FindFirstFile

(2008-11-03 13:38:54)
标签:

it

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

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

参数:

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

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

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

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

typedef struct _WIN32_FIND_DATA {
   DWORD     dwFileAttributes;
   FILETIME ftCreationTime;
   FILETIME ftLastAccessTime;
   FILETIME ftLastWriteTime;
   DWORD     nFileSizeHigh;
   DWORD     nFileSizeLow;
   DWORD     dwReserved0;
   DWORD     dwReserved1;
   TCHAR     cFileName[ MAX_PATH ];
   TCHAR     cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

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

示例代码段
#include "windows.h"

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   printf ("Target file is %s.\n", argv[1]);

   hFind = FindFirstFile(argv[1], &FindFileData);     //注意目录的形式后面要有*.*

   if (hFind == INVALID_HANDLE_VALUE) {
     printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
   } else {
     printf ("The first file found is %s\n", FindFileData.cFileName);
     FindClose(hFind);
   }

   return (0);
}


    关于文件的全部属性信息,总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。 

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

typedef  struct  _WIN32_FIND_DATA 

    DWORD  dwFileAttributes;  //文件属性 

    FILETIME  ftCreationTime;  //  文件创建时间 

    FILETIME  ftLastAccessTime;  //  文件最后一次访问时间 

    FILETIME  ftLastWriteTime;  //  文件最后一次修改时间 

    DWORD  nFileSizeHigh;  //  文件长度高32位 

    DWORD  nFileSizeLow;  //  文件长度低32位 

    DWORD  dwReserved0;  //  系统保留 

    DWORD  dwReserved1;  //  系统保留 

    TCHAR  cFileName[  MAX_PATH  ];  //  长文件名 

    TCHAR  cAlternateFileName[  14  ];  //  8.3格式文件名 

WIN32_FIND_DATA,  *PWIN32_FIND_DATA; 

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

WIN32_FIND_DATA  ffd 

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

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

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

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

typedef  struct  _FILE_INFO 

    TCHAR  szFileTitle[128];  //文件的标题名 

    DWORD  dwFileAttributes;  //文件的属性 

    FILETIME  ftCreationTime;  //文件的创建时间 

    FILETIME  ftLastAccessTime;  //文件的最后访问时间 

    FILETIME  ftLastWriteTime;  //文件的最后修改时间 

    DWORD  nFileSizeHigh;  //文件大小的高位双字 

    DWORD  nFileSizeLow;  //文件大小的低位双字 

    DWORD  dwReserved0;  //保留,为0 

    DWORD  dwReserved1;  //保留,为0 

FILE_INFO,  PFILE_INFO; 

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

//声明结构对象 

FILE_INFO  FileInfo; 

WIN32_FIND_DATA  FindFileData; 

…… 

//获取文件属性信息 

FindClose(FindFirstFile("Test.txt",&FindFileData)); 

memset(&FileInfo,0,sizeof(FILE_INFO)); 

…… 

//将文件属性信息保存到FileInfo中备用 

strcpy(FileInfo.szFileTitle,myFile.GetFileTitle()); 

FileInfo.dwFileAttributes  FindFileData.dwFileAttributes; 

FileInfo.ftCreationTime  FindFileData.ftCreationTime; 

FileInfo.ftLastAccessTime  FindFileData.ftLastAccessTime; 

FileInfo.ftLastWriteTime  FindFileData.ftLastWriteTime; 

FileInfo.nFileSizeHigh  FindFileData.nFileSizeHigh; 

FileInfo.nFileSizeLow  FindFileData.nFileSizeLow; 

…… 

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

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

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

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

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

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

SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes); 

    至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值