3.26 函数名:GetFileTime
(1)函数的概述
GetFileTime 是一个Windows API函数,它用于检索指定文件或目录的创建、访问和最后写入时间。这些时间以FILETIME结构的形式返回,该结构表示自1601年1月1日(UTC)起的100纳秒间隔数。
(2)函数所在的动态链接库
GetFileTime 函数位于 Kernel32.dll 动态链接库中。
(3)函数的原型
BOOL GetFileTime(
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
(4)各参数及返回值的详细解释
- hFile(输入参数):类型:HANDLE,描述:一个已打开的文件或目录的句柄。
- lpCreationTime(输出参数):类型:LPFILETIME(指向FILETIME结构的指针),描述:指向接收文件创建时间的FILETIME结构的指针。
- lpLastAccessTime(输出参数):类型:LPFILETIME(指向FILETIME结构的指针),描述:指向接收文件最后访问时间的FILETIME结构的指针。
- lpLastWriteTime(输出参数):类型:LPFILETIME(指向FILETIME结构的指针),描述:指向接收文件最后写入时间的FILETIME结构的指针。
- 返回值:类型:BOOL,描述:如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展的错误信息,可以调用GetLastError。
(5)函数的详细作用
GetFileTime函数用于检索与指定文件或目录句柄相关联的创建、访问和最后写入时间。这些时间戳对于文件管理和监视文件更改非常有用。
(6)函数的C++示例
#include <windows.h>
#include <iostream>
#include <ctime>
#include <iomanip>
void ConvertFileTimeToLocalTime(const FILETIME& ft, SYSTEMTIME& st) {
FILETIME localFileTime;
FileTimeToLocalFileTime(&ft, &localFileTime);
FileTimeToSystemTime(&localFileTime, &st);
}
void PrintFileTime(const FILETIME& ft) {
SYSTEMTIME st;
ConvertFileTimeToLocalTime(ft, st);
std::cout << std::put_time(&st, "%Y-%m-%d %H:%M:%S") << std::endl;
}
int main() {
HANDLE hFile = CreateFileA(
"C:\\example\\test.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "CreateFile failed." << std::endl;
return 1;
}
FILETIME ftCreate, ftAccess, ftWrite;
if (GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite)) {
std::cout << "Creation time: ";
PrintFileTime(ftCreate);
std::cout << "Last access time: ";
PrintFileTime(ftAccess);
std::cout << "Last write time: ";
PrintFileTime(ftWrite);
} else {
std::cerr << "GetFileTime failed." << std::endl;
}
CloseHandle(hFile);
return 0;
}
(7)使用时的注意事项
- 确保在调用GetFileTime之前,文件或目录句柄是有效的,并且已经通过CreateFile或其他相关函数打开。
- 返回值应该被检查以确保函数成功执行。如果函数失败,可以调用GetLastError获取扩展的错误信息。
- 如果需要将FILETIME结构转换为本地时间,可以使用FileTimeToLocalFileTime和FileTimeToSystemTime函数,并可能使用put_time(在C++中)来格式化输出。
- 句柄在使用完毕后应该使用CloseHandle函数关闭,以释放系统资源。
- 在多线程环境中,需要注意对句柄的同步访问,以避免竞态条件。
- 在处理文件路径时
3.27 函数名:GetFileType
(1)函数的概述
GetFileType 是一个Windows API函数,用于确定指定文件或设备的类型。它可以用来检测文件是磁盘文件、磁盘驱动器、字符设备、管道还是未知类型。
(2)函数所在的动态链接库
GetFileType 函数通常位于 Kernel32.dll 动态链接库中。
(3)函数的原型
DWORD GetFileType(
HANDLE hFile
);
(4)各参数及返回值的详细解释
- hFile:这是一个打开的文件的句柄,或者是一个设备的句柄。它必须是一个有效的句柄,并且具有FILE_READ_ATTRIBUTES访问权限。
- 返回值:
- FILE_TYPE_UNKNOWN (0x0000):文件类型未知。
- FILE_TYPE_DISK (0x0001):文件在磁盘上。
- FILE_TYPE_CHAR (0x0002):文件是一个字符设备,如控制台或串口。
- FILE_TYPE_PIPE (0x0003):文件是一个命名管道。
- FILE_TYPE_REMOTE (0x8000):这是一个远程文件。此值通常与上述类型之一组合使用,如 FILE_TYPE_REMOTE | FILE_TYPE_DISK。
(5)函数的详细作用
GetFileType 函数用于确定文件或设备的类型。这对于需要区分不同文件类型的应用程序或系统服务非常有用。例如,一个备份软件可能需要知道一个文件是否是一个磁盘文件,以便决定如何备份它。
(6)函数的C++示例
#include <windows.h>
#include <iostream>
int main() {
HANDLE hFile = CreateFileA("C:\\example.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open file." << std::endl;
return 1;
}
DWORD fileType = GetFileType(hFile);
switch (fileType) {
case FILE_TYPE_DISK:
std::cout << "The file is a disk file." << std::endl;
break;
case FILE_TYPE_CHAR:
std::cout << "The file is a character device." << std::endl;
break;
case FILE_TYPE_PIPE:
std::cout << "The file is a named pipe." << std::endl;
break;
case FILE_TYPE_UNKNOWN:
default:
std::cout << "The file type is unknown." << std::endl;
break;
}
CloseHandle(hFile);
return 0;
}
(7)使用时的注意事项
- 确保提供的句柄是有效的,并且具有适当的访问权限。
- 在使用完句柄后,应使用CloseHandle函数关闭它。
- 在调用GetFileType之前,不需要检查句柄是否指向一个存在的文件或设备,因为该函数可以处理不存在的句柄(在这种情况下,它可能会返回FILE_TYPE_UNKNOWN)。
- 由于这是一个Windows API函数,它只适用于Windows操作系统。在其他操作系统上,这个函数不可用。
3.28 函数名:GetFileVersionInfo
(1)函数的概述
GetFileVersionInfo 是一个Windows API函数,用于检索有关文件版本信息的详细数据。它提供了关于二进制文件(如DLL、EXE、OCX等)的版本信息,这些信息通常用于软件分发、安装和更新。
(2)函数所在的动态链接库
GetFileVersionInfo 函数通常位于 Version.dll 动态链接库中。
(3)函数的原型
BOOL GetFileVersionInfo(
LPCTSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
void *lpData
);
(4)各参数及返回值的详细解释
- lptstrFilename:指向要检索版本信息的文件的完整路径的字符串的指针。
- dwHandle:这个参数在调用GetFileVersionInfo时通常被设置为0,除非你想从之前由GetFileVersionInfoSize函数返回的缓冲区中检索信息。
- dwLen:lpData缓冲区的大小(以字节为单位)。
- lpData:指向接收版本信息数据的缓冲区的指针。这个缓冲区的大小应该由GetFileVersionInfoSize函数确定。
- 返回值:
- 如果函数成功,返回值为非零。
- 如果函数失败,返回值为0。要获取更多错误信息,可以调用GetLastError。
(5)函数的详细作用
GetFileVersionInfo函数用于检索指定文件的版本信息。这些信息通常包括文件的主要版本、次要版本、构建号和修订号,以及可能的其他字符串信息,如公司名称、产品名称、文件描述等。这些信息通常被存储在文件的资源部分,并遵循特定的版本信息格式。
(6)函数的C++示例
#include <windows.h>
#include <verrsrc.h>
#include <stdio.h>
#pragma comment(lib, "version.lib")
int main() {
const char* filePath = "C:\\example.exe";
DWORD dwHandle = 0;
DWORD dwInfoSize = GetFileVersionInfoSize(filePath, &dwHandle);
if (dwInfoSize == 0) {
printf("Failed to get file version info size.\n");
return 1;
}
void* pVersionInfo = malloc(dwInfoSize);
if (!GetFileVersionInfo(filePath, dwHandle, dwInfoSize, pVersionInfo)) {
printf("Failed to get file version info.\n");
free(pVersionInfo);
return 1;
}
// 这里可以添加代码来解析pVersionInfo缓冲区中的版本信息
// ...
free(pVersionInfo);
return 0;
}
// 注意:上面的示例只演示了如何获取版本信息的大小并分配缓冲区,
// 但没有展示如何解析版本信息。这通常需要调用VerQueryValue函数。
(7)使用时的注意事项
- 确保filePath指向的文件存在且可访问。
- 在调用GetFileVersionInfo之前,使用GetFileVersionInfoSize函数确定缓冲区的大小,以避免缓冲区溢出。
- 在使用完pVersionInfo缓冲区后,记得释放它。
- 如果文件没有版本信息或版本信息格式不正确,GetFileVersionInfo可能会失败。
- 如果你需要解析版本信息,你可能需要使用VerQueryValue函数来从pVersionInfo缓冲区中提取所需的数据。
- 由于这是一个Windows API函数,它只适用于Windows操作系统。在其他操作系统上,这个函数不可用。
3.29 函数名:GetFileVersionInfoSize
(1)函数的概述
GetFileVersionInfoSize 是一个Windows API函数,用于确定为了包含文件的版本信息,需要为GetFileVersionInfo函数分配多大的缓冲区。这个函数为调用者提供了一个预先确定缓冲区大小的方法,从而可以确保有足够的空间来接收版本信息。
(2)函数所在的动态链接库
GetFileVersionInfoSize 函数通常位于 Version.dll 动态链接库中。
(3)函数的原型
DWORD GetFileVersionInfoSize(
LPCTSTR lptstrFilename,
LPDWORD lpdwHandle
);
(4)各参数及返回值的详细解释
- lptstrFilename:
- 类型:LPCTSTR(一个指向常量字符串的指针,可以是ANSI或Unicode字符串)
- 描述:指向要检索版本信息的文件的完整路径的字符串的指针。
- lpdwHandle:
- 类型:LPDWORD(指向DWORD的指针)
- 描述:此参数在调用GetFileVersionInfoSize时通常被设置为NULL。如果此参数不是NULL,它将接收一个句柄,该句柄可用于后续的GetFileVersionInfo调用(但这通常不是必需的)。
- 返回值:
- 类型:DWORD
- 描述:返回为了包含文件的版本信息所需的缓冲区大小(以字节为单位)。如果函数失败,返回值为0。要获取更多错误信息,可以调用GetLastError。
(5)函数的详细作用
GetFileVersionInfoSize 函数的作用是确定为了检索特定文件的版本信息,需要为GetFileVersionInfo函数分配多大的缓冲区。这是因为在某些情况下,文件的版本信息可能非常大,因此预先确定所需的大小可以避免缓冲区溢出。
(6)函数的C++示例
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "version.lib")
int main() {
const char* filePath = "C:\\example.exe";
DWORD dwHandle = 0; // 在此示例中,我们不需要句柄,因此将其设置为0
DWORD dwInfoSize = GetFileVersionInfoSize(filePath, &dwHandle);
if (dwInfoSize == 0) {
DWORD dwError = GetLastError();
printf("Failed to get file version info size. Error code: %lu\n", dwError);
return 1;
}
// 现在,我们可以为GetFileVersionInfo分配一个足够大的缓冲区
void* pVersionInfo = malloc(dwInfoSize);
if (pVersionInfo == NULL) {
printf("Failed to allocate memory for file version info.\n");
return 1;
}
// 接下来,你可以使用GetFileVersionInfo来检索版本信息
// ...
// 释放内存
free(pVersionInfo);
return 0;
}
(7)使用时的注意事项
- 确保filePath指向的文件存在且可访问。
- lpdwHandle参数在大多数情况下可以设置为NULL,除非你打算在后续的GetFileVersionInfo调用中使用这个句柄。
- 在使用malloc分配内存后,确保在不再需要时释放它,以避免内存泄漏。
- 如果GetFileVersionInfoSize返回0,表示函数失败,此时应该调用GetLastError来获取更详细的错误信息。
- 文件的版本信息可能不存在或格式不正确,这可能导致GetFileVersionInfoSize失败。
- 由于这是一个Windows API函数,它只适用于Windows操作系统。在其他操作系统上,这个函数不可用。
3.30 函数名:GetFullPathName
(1)函数的概述
GetFullPathName 是一个Windows API函数,它用于检索指定文件或目录的完整路径名。这个函数会解析任何路径中的相对路径部分(如.、..)和符号链接,并返回包含绝对路径的字符串。
(2)函数所在的动态链接库
GetFullPathName 函数通常位于 Kernel32.dll 动态链接库中。
(3)函数的原型
DWORD GetFullPathName(
LPCTSTR lpFileName,
LPDWORD lpnBufferLength,
LPTSTR lpBuffer,
LPTSTR *lpFilePart
);
(4)各参数及返回值的详细解释
- lpFileName:
- 类型:LPCTSTR(指向常量字符串的指针)
- 描述:指定要检索其完整路径名的文件或目录的名称。这个名称可以是相对路径或绝对路径。
- lpnBufferLength:
- 类型:LPDWORD(指向DWORD的指针)
- 描述:在调用时,这个参数应该指向一个变量,该变量包含lpBuffer缓冲区的大小(以TCHAR为单位)。如果函数成功,这个变量将被设置为返回的完整路径名的长度(不包括终止的空字符)。
- lpBuffer:
- 类型:LPTSTR(指向TCHAR字符串的指针)
- 描述:指向一个缓冲区,该缓冲区接收文件或目录的完整路径名。如果缓冲区太小而无法容纳完整路径名,则路径名将被截断,但总是以空字符结尾。
- lpFilePart:
- 类型:LPTSTR *(指向LPTSTR的指针)
- 描述:如果此参数不为NULL,它将接收指向lpBuffer中完整路径名中最后一个组成部分(即文件名或目录名)的指针。这通常用于在路径和文件名之间分隔字符串。
- 返回值:
- 类型:DWORD
- 描述:如果函数成功,返回值是完整路径名的长度(以TCHAR为单位),不包括终止的空字符。如果缓冲区太小,无法容纳完整的路径和终止的空字符,返回值是所需的缓冲区大小,包括终止的空字符。如果函数失败,返回值是0。要获取更多错误信息,可以调用GetLastError。
(5)函数的详细作用
GetFullPathName 的主要作用是获取指定文件或目录的完整路径名。这在处理相对路径、符号链接或需要确定文件或目录的确切位置时非常有用。它还可以用来检查路径是否存在或验证路径的语法是否正确。
(6)函数的C++示例
#include <windows.h>
#include <iostream>
int main() {
const char* filePath = "..\\example.txt"; // 相对路径
DWORD dwBufferSize = MAX_PATH; // 假设缓冲区足够大以容纳完整路径
char buffer[MAX_PATH];
char* filePart;
DWORD result = GetFullPathName(filePath, &dwBufferSize, buffer, &filePart);
if (result == 0) {
std::cerr << "GetFullPathName failed with error: " << GetLastError() << std::endl;
return 1;
}
std::cout << "Full pat