曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 8160|回复: 0
打印 上一主题 下一主题

[文件与IO] GetFileAttributesEx() -- 获取文件属性(扩展版)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-2-17 11:29:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 字节
<存档>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 13:31 , Processed in 0.065282 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表