曲径通幽论坛

标题: GetFileAttributesEx() -- 获取文件属性(扩展版) [打印本页]

作者: beyes    时间: 2012-2-17 11:29
标题: GetFileAttributesEx() -- 获取文件属性(扩展版)
GetFileAttributesEx() 原型如下:
[Plain Text] 纯文本查看 复制代码
BOOL WINAPI GetFileAttributesEx(
  __in   LPCTSTR lpFileName,
  __in   GET_FILEEX_INFO_LEVELS fInfoLevelId,
  __out  LPVOID lpFileInformation
);

该函数用来获取文件目录的属性,时间,大小,并以圀IN32_FILE_ATTRIBUTE_DATA结构形式返回,它是 GetFileAttributes()函数的扩展版本。

WIN32_FILE_ATTRIBUTE_DATA 结构定义如下:
[Plain Text] 纯文本查看 复制代码
typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
  DWORD    dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD    nFileSizeHigh;
  DWORD    nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;

由上结构看到,第 1 个成员 dwFileAttributes 正是 GetFileAttributes() 函数的返回值,因此说它是 GetFileAttributes() 扩展版本。

第 1 个参数 lpFileName 指定用你来获取属性的文件或目录。

第 2 个参数 fInfoLevelId 是获取文件属性信息的类别,它的设定会影响到第 3 个参数 lpFileInformation 具体以什么形式输出结果,但是该参数通常只能指定为 GetFileExInfoStandard 。

第3 个参数 lpFileInformation 用于返回结果。如果第 2 个参数指定为 GetFileExInfoStandard那么这个参数的类型就是 WIN32_FILE_ATTRIBUTE_DATA 结构的一个指针。

测试代码
[C++] 纯文本查看 复制代码

#include "stdafx.h"

DWORD ChangeTime (PFILETIME lptime)
{
    FILETIME ftLocal;    //文件时间结构

    SYSTEMTIME st;        //系统时间结构

    FileTimeToLocalFileTime(lptime, &ftLocal);    //调整为系统所在时区时间

    FileTimeToSystemTime(&ftLocal, &st);    //文件时间转为系统时间

    _tprintf (TEXT("%4d年%2d月%2d日  %2d:%2d:%2d\n"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

    return 0;
}
/*
* dwFileSizeHigh 文件大小高 32 位
* dwFileSizeLow  文件大小低 32 位
*/
DWORD FileSize (DWORD dwFileSizeHigh, DWORD dwFileSizeLow)
{
    ULONGLONG llFileSize = dwFileSizeHigh;
   
    llFileSize <<= sizeof(DWORD)*8; //左移 32 位
    llFileSize += dwFileSizeLow;

    _tprintf (TEXT("文件大小:\t%I64u 字节\n"), llFileSize);    //I64 即为 unsigned __int64

    return 0;
}

DWORD FileAttInfo (DWORD dwFileAtt)
{
    if (dwFileAtt & FILE_ATTRIBUTE_ARCHIVE) {
        _tprintf (TEXT("<存档> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_COMPRESSED) {
        _tprintf (TEXT("<压缩> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_DIRECTORY) {
        _tprintf (TEXT("<目录> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_ENCRYPTED) {
        _tprintf (TEXT("<加密> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_HIDDEN) {
        _tprintf (TEXT("<隐藏> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_NORMAL) {
        _tprintf (TEXT("<普通> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {
        _tprintf (TEXT("<非内容索引服务> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_OFFLINE) {
        _tprintf (TEXT("<脱机> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_OFFLINE) {
        _tprintf (TEXT("<离线> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_READONLY) {
        _tprintf (TEXT("<只读> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_REPARSE_POINT) {
        _tprintf (TEXT("<再解析或符号链接> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_SPARSE_FILE) {
        _tprintf (TEXT("<再解析> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_SYSTEM) {
        _tprintf (TEXT("<系统文件> "));
    }
    if (dwFileAtt & FILE_ATTRIBUTE_TEMPORARY) {
        _tprintf (TEXT("<临时文件> "));
    }
    _tprintf (TEXT("\n"));

    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "chs");

    WIN32_FILE_ATTRIBUTE_DATA wfad;

    if (!GetFileAttributesEx(argv[1], GetFileExInfoStandard, &wfad)) {
        _tprintf (TEXT("获取文件属性错误:%d\n"), GetLastError());
        return (-1);
    }
    //显示文件时间
    _tprintf (TEXT("创建时间:\t"));
    ChangeTime (&wfad.ftCreationTime);

    _tprintf (TEXT("最后访问时间:\t"));
    ChangeTime (&wfad.ftLastAccessTime);

    _tprintf (TEXT("最后修改时间:\t"));
    ChangeTime (&wfad.ftLastWriteTime);

    //显示文件大小
    FileSize (wfad.nFileSizeHigh, wfad.nFileSizeLow);

    //显示文件属性
    FileAttInfo (wfad.dwFileAttributes);

    return 0;
}

运行输出:
D:\WinAPI\GetFileAttEx\Debug>GetFileAttEx.exe d:\special.php
创建时间:2011年10月25日14: 9:19
最后访问时间:2011年10月25日14: 9:19
最后修改时间:2009年 2月20日11:34:46
文件大小:201 字节
<存档>





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2