關於文件的全部屬性信息,總計有以下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;
}