VC++文件操作,获取文件属性信息,判断文件是否存在,移动和拷贝文件
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
使用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 个字符。 若要将此限制扩展到 32767 宽字符请调用函数的 Unicode 版本并将“\”追加到路径。 有关详细信息请参阅 命名文件。
提示从 Windows 10 版本 1607 开始对于此函数的 unicode 版本 (CopyFileW) 可以选择加入以删除MAX_PATH限制而无需追加“\\\”。 有关详细信息请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
如果 lpExistingFileName 不存在 CopyFile 将失败 GetLastError 将返回 ERROR_FILE_NOT_FOUND。
[in] lpNewFileName
新文件的名称。
在此函数的 ANSI 版本中名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32767 宽字符请调用函数的 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 个字符。 若要将此限制扩展到 32767 宽字符请调用函数的 Unicode 版本并将“\”追加到路径。 有关详细信息请参阅 命名文件。
提示从Windows 10版本 1607 开始对于此函数的 unicode 版本 (MoveFileW) 你可以选择加入以删除MAX_PATH限制而无需附加“\\\”。 有关详细信息请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
[in] lpNewFileName
文件或目录的新名称。 新名称不得已存在。 新文件可能位于不同的文件系统或驱动器上。 新目录必须位于同一驱动器上。
在此函数的 ANSI 版本中名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32767 宽字符请调用函数的 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");