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 字节
<存档> |