使用FindFirstFile()函数得到文件信息
HANDLE FindFirstFileA(
[in] LPCSTR lpFileName,
[out] LPWIN32_FIND_DATAA lpFindFileData
);
WIN32_FIND_DATA结构
包含有关 FindFirstFile、 FindFirstFileEx 或 FindNextFile 函数找到的文件的信息。
typedef struct _WIN32_FIND_DATAW {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[MAX_PATH];
WCHAR cAlternateFileName[14];
DWORD dwFileType; // Obsolete. Do not use.
DWORD dwCreatorType; // Obsolete. Do not use
WORD wFinderFlags; // Obsolete. Do not use
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
成员
dwFileAttributes
文件的文件属性。
有关可能的值及其说明,请参阅 文件属性常量。
如果文件的任何流都稀疏,则会设置文件上的 FILE_ATTRIBUTE_SPARSE_FILE 属性。
ftCreationTime
一个 FILETIME 结构,指定创建文件或目录的时间。
如果基础文件系统不支持创建时间,则此成员为零。
ftLastAccessTime
FILETIME 结构。
对于文件,结构指定上次读取文件、写入可执行文件或可执行文件时运行。
对于目录,结构指定创建目录时。 如果基础文件系统不支持上次访问时间,则此成员为零。
在 FAT 文件系统中,文件和目录的指定日期正确,但一天的时间始终设置为午夜。
ftLastWriteTime
FILETIME 结构。
对于文件,结构指定上次写入、截断或覆盖文件时,例如,使用 WriteFile 或 SetEndOfFile 时。 更改文件属性或安全描述符时,日期和时间不会更新。
对于目录,结构指定创建目录时。 如果基础文件系统不支持上次写入时间,则此成员为零。
nFileSizeHigh
文件大小的高顺序 DWORD 值(以字节为单位)。
此值为零,除非文件大小大于 MAXDWORD。
文件的大小等于 (nFileSizeHigh * (MAXDWORD+1) ) + nFileSizeLow。
nFileSizeLow
文件大小的低序 DWORD 值(以字节为单位)。
dwReserved0
如果 dwFileAttributes 成员包含 FILE_ATTRIBUTE_REPARSE_POINT属性 ,则此成员指定重新分析点标记。
否则,此值未定义,不应使用。
有关详细信息,请参阅 重新分析点标记。
IO_REPARSE_TAG_CSV (0x80000009)
IO_REPARSE_TAG_DEDUP (0x80000013)
IO_REPARSE_TAG_DFS (0x8000000A)
IO_REPARSE_TAG_DFSR (0x80000012)
IO_REPARSE_TAG_HSM (0xC0000004)
IO_REPARSE_TAG_HSM2 (0x80000006)
IO_REPARSE_TAG_MOUNT_POINT (0xA0000003)
IO_REPARSE_TAG_NFS (0x80000014)
IO_REPARSE_TAG_SIS (0x80000007)
IO_REPARSE_TAG_SYMLINK (0xA000000C)
IO_REPARSE_TAG_WIM (0x80000008)
dwReserved1
保留供将来使用。
cFileName[MAX_PATH]
文件的名称。
cAlternateFileName[14]
文件的备用名称。
此名称采用经典 8.3 文件格式。
dwFileType
已过时。 请勿使用。
dwCreatorType
已过时。 请勿使用。
wFinderFlags
已过时。 请勿使用。
对于FILETIME结构体,转化成SYSTEMTIME便于读取,使用FileTimeToSystemTime函数进行转换
将文件时间转换为系统时间格式。 系统时间基于协调世界时 (UTC)
BOOL FileTimeToSystemTime(
[in] const FILETIME *lpFileTime,
[out] LPSYSTEMTIME lpSystemTime
);
参数
[in] lpFileTime
指向 FILETIME 结构的指针,其中包含要转换为系统 (UTC) 日期和时间格式的文件时间。
此值必须小于0x8000000000000000。 否则,该函数将失败。
[out] lpSystemTime
指向 SYSTEMTIME 结构的指针,用于接收转换的文件时间。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
SYSTEMTIME
指定日期和时间,使用月份、日、年、工作日、小时、分钟、秒和毫秒的单个成员。 时间是协调世界时 (UTC) 或本地时间,具体取决于调用的函数。
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
成员
wYear
年。 此成员的有效值为 1601 到 30827。
wMonth
月份。 此成员可以是以下值之一。
Value 含义
1
1 月
2
2 月
3
3 月
4
4 月
5
5月
6
6 月
7
7 月
8
8 月
9
9 月
10
10 月
11
11 月
12
12 月
wDayOfWeek
星期几。 此成员可以是以下值之一。
Value 含义
0
星期日
1
星期一
2
星期二
3
星期三
4
星期四
5
星期五
6
星期六
wDay
每月的日期。 此成员的有效值为 1 到 31。
wHour
小时。 此成员的有效值为 0 到 23。
wMinute
分钟。 此成员的有效值为 0 到 59。
wSecond
秒钟。 此成员的有效值为 0 到 59。
wMilliseconds
毫秒。 此成员的有效值为 0 到 999。
从文件获取属性和最后修改时间信息
WIN32_FIND_DATA fileData;
HANDLE hFindFile = FindFirstFile("D:\\1.txt",&fileData);
FindClose(hFindFile);
FILETIME fileTime = fileData.ftLastWriteTime;
SYSTEMTIME sysTime;
FileTimeToSystemTime(&fileTime,&sysTime);
printf("文件的最后修改时间为:%04d-%02d-%02d %02d:%02d:%02d\n",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour+8,sysTime.wMinute,sysTime.wSecond);
通过FindFirstFile返回值可判断文件是否存在,dwFileAttributes表示文件属性,通过dwFileAttributes变量判断是否是目录或者普通文件
WIN32_FIND_DATA fileData;
HANDLE hFindFile = FindFirstFile("D:\\bg11.jpg",&fileData);
if(INVALID_HANDLE_VALUE == hFindFile){
printf("不存在该文件或目录!\n");
}else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
printf("%s是一个目录!\n",fileData.cFileName);
}else{
printf("%s是一个文件!\n",fileData.cFileName);
}
FindClose(hFindFile);
将现有文件复制到新文件。
BOOL CopyFile(
[in] LPCTSTR lpExistingFileName,
[in] LPCTSTR lpNewFileName,
[in] BOOL bFailIfExists
);
参数
[in] lpExistingFileName
现有文件的名称。
在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请调用函数的 Unicode 版本,并将“\?”追加到路径。 有关详细信息,请参阅 命名文件。
提示从 Windows 10 版本 1607 开始,对于此函数的 unicode 版本 (CopyFileW) ,可以选择加入以删除MAX_PATH限制,而无需追加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
如果 lpExistingFileName 不存在, CopyFile 将失败, GetLastError 将返回 ERROR_FILE_NOT_FOUND。
[in] lpNewFileName
新文件的名称。
在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请调用函数的 Unicode 版本,并将“\?”追加到路径。 有关详细信息,请参阅 命名文件。
提示从 Windows 10 版本 1607 开始,对于此函数的 unicode 版本 (CopyFileW) ,可以选择加入以删除MAX_PATH限制,而无需追加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
[in] bFailIfExists
如果此参数为 TRUE ,并且 lpNewFileName 指定的新文件已存在,则函数将失败。 如果此参数为 FALSE 且新文件已存在,则函数将覆盖现有文件并成功。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
移动现有文件或目录,包括其子级。
BOOL MoveFile(
[in] LPCTSTR lpExistingFileName,
[in] LPCTSTR lpNewFileName
);
参数
[in] lpExistingFileName
本地计算机上的文件或目录的当前名称。
在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请调用函数的 Unicode 版本,并将“\?”追加到路径。 有关详细信息,请参阅 命名文件。
提示从Windows 10版本 1607 开始,对于此函数的 unicode 版本 (MoveFileW) ,你可以选择加入以删除MAX_PATH限制,而无需附加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
[in] lpNewFileName
文件或目录的新名称。 新名称不得已存在。 新文件可能位于不同的文件系统或驱动器上。 新目录必须位于同一驱动器上。
在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请调用函数的 Unicode 版本,并将“\?”追加到路径。 有关详细信息,请参阅 命名文件。
提示从Windows 10版本 1607 开始,对于此函数的 unicode 版本 (MoveFileW) ,你可以选择加入以删除MAX_PATH限制,而无需附加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
拷贝"D:\bg1.jpg"到"D:\bg2.jpg"
CopyFile("D:\\bg1.jpg","D:\\bg2.jpg",true);
移动"D:\bg2.jpg"到"D:\bg3.jpg"
MoveFile("D:\\bg2.jpg","D:\\bg3.jpg");