关于文件的全部属性信息,总计有以下9种:文件的标题名,文件的属性(只读,存档,隐藏等),文件的创建时间,文件的最后访问时间,文件的最后修改时间,文件大小的高双位字节,文件大小的低双位字节,保留,保留。
在使用FindFirstFile()和FindNextFile()函数去查找磁盘文件时,经常使用的一个数据结构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 hFile = FindFirstFile("c://test.dat", &ffd);
在使用这个结构的时候不能手工修改这个结构中的任何数据,结构对于开发人员来说只能是只读数据,其所有成员变量都会由系统完成填写。
2. FindFirstFile
原形:
HANDLE WINAPI FindFirstFileW(
__in LPCWSTR lpFileName, // 文件名:可以使用指定文件名,也可以使用*.*,必须指定路径
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
3. FindNextFile
原形:
BOOL WINAPI FindNextFileW(
__in HANDLE hFindFile, // hFile handle
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
注意:
返回类型为BOOL型
4. GetCurrentDirectory
原形:
DWORD WINAPI GetCurrentDirectoryW(
__in DWORD nBufferLength,
__out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer
);
5. strcmpi
原形:
int strcmpi(const char* str1, const char* str2);
6. CompareFileTime
原形:
int CompareFileTime(LPFILETIME fileTime1, LPFILETIME fileTime2);
7. DeleteFile与CopyFile
8. 示例
// console.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#define FILE_MAX 300
int _tmain(int argc, _TCHAR* argv[])
{
int i, j, nSrcFiles, nDestFiles;
HANDLE hFile;
WIN32_FIND_DATA fd, srcFiles[FILE_MAX], destFiles[FILE_MAX];
BOOL bRet = TRUE;
TCHAR src[MAX_PATH+1], dest[MAX_PATH+1], destpath[MAX_PATH+1];
DWORD dwcNameSize = MAX_PATH + 1;
TCHAR szBuf[MAX_PATH+1];
lstrcpy(src, argv[1]);
GetCurrentDirectory(dwcNameSize, szBuf);
lstrcpy(dest, szBuf);
lstrcpy(destpath, szBuf);
lstrcat(src, "//*.*"); // c:/document/*.*
lstrcat(dest, "//*.*"); // d:/document/*.*
nSrcFiles = 0; // display files of src directory
bRet = TRUE;
hFile = FindFirstFile(src, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
srcFiles[nSrcFiles] = fd; // add to an fd array
printf("srcFiles[%d]: %s/n", nSrcFiles, fd.cFileName);
nSrcFiles++;
bRet = FindNextFile(hFile, &fd);
}
nDestFiles = 0; // display files of dest directory
bRet = TRUE;
hFile = FindFirstFile(dest, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
destFiles[nDestFiles] = fd; // add to an fd array
printf("destFiles[%d]: %s/n", nDestFiles, fd.cFileName);
nDestFiles++;
bRet = FindNextFile(hFile, &fd);
}
for(i=2;i<nSrcFiles;i++)
{
for (j=0;j<nDestFiles;j++)
{
if(strcmpi(srcFiles[i].cFileName, destFiles[j].cFileName) == 0)
{
printf("Match File: %s/n", srcFiles[i].cFileName);
if (CompareFileTime(&srcFiles[i].ftLastWriteTime,&destFiles[j].ftLastWriteTime) > 0)
{
printf("File is modified: %s/n", srcFiles[i].cFileName);
strcpy(dest, destpath);
strcat(dest,"//");
strcat(dest, srcFiles[i].cFileName);
printf("copy file: %s/n", dest);
DeleteFile(dest);
CopyFile(srcFiles[i].cFileName, dest, FALSE); // FALSE is Overwrite
}
}
}
}
return 0;
}