VCpp文件操作,获取文件属性信息,判断文件是否存在,移动和拷贝文件

⌚Time: 2023-01-14 14:09:32

👨‍💻Author: Jack Ge

使用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



年。 此成员的有效值为 160130827



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



每月的日期。 此成员的有效值为 131



wHour



小时。 此成员的有效值为 023



wMinute



分钟。 此成员的有效值为 059



wSecond



秒钟。 此成员的有效值为 059



wMilliseconds



毫秒。 此成员的有效值为 0999

从文件获取属性和最后修改时间信息


    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");