windows API函数之文件类函数(二)

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)使用时的注意事项

  1. 确保在调用GetFileTime之前,文件或目录句柄是有效的,并且已经通过CreateFile或其他相关函数打开。
  2. 返回值应该被检查以确保函数成功执行。如果函数失败,可以调用GetLastError获取扩展的错误信息。
  3. 如果需要将FILETIME结构转换为本地时间,可以使用FileTimeToLocalFileTime和FileTimeToSystemTime函数,并可能使用put_time(在C++中)来格式化输出。
  4. 句柄在使用完毕后应该使用CloseHandle函数关闭,以释放系统资源。
  5. 在多线程环境中,需要注意对句柄的同步访问,以避免竞态条件。
  6. 在处理文件路径时

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)使用时的注意事项

  1. 确保提供的句柄是有效的,并且具有适当的访问权限。
  2. 在使用完句柄后,应使用CloseHandle函数关闭它。
  3. 在调用GetFileType之前,不需要检查句柄是否指向一个存在的文件或设备,因为该函数可以处理不存在的句柄(在这种情况下,它可能会返回FILE_TYPE_UNKNOWN)。
  4. 由于这是一个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)使用时的注意事项

  1. 确保filePath指向的文件存在且可访问。
  2. 在调用GetFileVersionInfo之前,使用GetFileVersionInfoSize函数确定缓冲区的大小,以避免缓冲区溢出。
  3. 在使用完pVersionInfo缓冲区后,记得释放它。
  4. 如果文件没有版本信息或版本信息格式不正确,GetFileVersionInfo可能会失败。
  5. 如果你需要解析版本信息,你可能需要使用VerQueryValue函数来从pVersionInfo缓冲区中提取所需的数据。
  6. 由于这是一个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)使用时的注意事项

  1. 确保filePath指向的文件存在且可访问。
  2. lpdwHandle参数在大多数情况下可以设置为NULL,除非你打算在后续的GetFileVersionInfo调用中使用这个句柄。
  3. 在使用malloc分配内存后,确保在不再需要时释放它,以避免内存泄漏。
  4. 如果GetFileVersionInfoSize返回0,表示函数失败,此时应该调用GetLastError来获取更详细的错误信息。
  5. 文件的版本信息可能不存在或格式不正确,这可能导致GetFileVersionInfoSize失败。
  6. 由于这是一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hn_tzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值