本文主要是介绍c++ Windows系统API 获取文件属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
某些特殊情景下,我们需要去获取某一文件的属性,例如:创建时间、上次修改时间、读写状态等属性。对与创建时间、上次修改时间来说,我们还可以通过创建一个文件(记录目标文件的创建时间、上次修改时间)来实现,但是该方法浪费资源、且效率地下。
Windows系统提供了获取文件属性的API:GetFileAttributes
主要内容
GetFileAttributes函数
// 函数
DWORD GetFileAttributes( LPCTSTR lpFileName );
返回值类型DWORD 是一个32位无符号整数数据类型。理论上,它的每一位都表示一种文件属性的状态。
函数参数类型 LPCTSTR ,它是一个宏定义,由几个部分组成:
1.LP表示long pointer : 长指针类型
2.C表示const : 指针指向的内容为常量
3.T代表在Win32环境中可能存在的_T宏,用于兼容Unicode和ANSI字符串;(具体不太清楚)
4.STR表示这个变量是一个字符串
代码Demo
// 指定要获取属性的文件路径 const char* filePath = "C:\\path\\to\\your\\file.txt"; // 调用GetFileAttributes函数获取文件属性 DWORD fileAttributes = GetFileAttributes(filePath); // 检查函数是否执行成功 if (fileAttributes == INVALID_FILE_ATTRIBUTES) { printf("无法获取文件属性,请检查文件路径是否正确。\n"); return 1; // 返回错误代码 } // 解析并打印文件属性 if (fileAttributes & FILE_ATTRIBUTE_READONLY) { printf("文件是只读的。\n"); } if (fileAttributes & FILE_ATTRIBUTE_HIDDEN) { printf("文件是隐藏的。\n"); } if (fileAttributes & FILE_ATTRIBUTE_SYSTEM) { printf("文件是系统文件。\n"); } if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("这是一个目录。\n"); } if (fileAttributes & FILE_ATTRIBUTE_ARCHIVE) { printf("文件需要备份。\n"); }
判断文件是否具有某些属性,需要我们进行位运算 (与、或、非)
从DOWRD中获取文件的属性需要使用一些宏,类似FILE_ATTRIBUTE_READONLY这样的宏Windows API给我们提供了以下这些。
#define FILE_SHARE_READ 0x00000001
#define FILE_SHARE_WRITE 0x00000002
#define FILE_SHARE_DELETE 0x00000004
#define FILE_SHARE_VALID_FLAGS 0x00000007
#define FILE_ATTRIBUTE_READONLY 0x00000001
#define FILE_ATTRIBUTE_HIDDEN 0x00000002
#define FILE_ATTRIBUTE_SYSTEM 0x00000004
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
#define FILE_ATTRIBUTE_ARCHIVE 0x00000020
#define FILE_ATTRIBUTE_DEVICE 0x00000040
#define FILE_ATTRIBUTE_NORMAL 0x00000080
#define FILE_ATTRIBUTE_TEMPORARY 0x00000100
#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
#define FILE_ATTRIBUTE_COMPRESSED 0x00000800
#define FILE_ATTRIBUTE_OFFLINE 0x00001000
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
#define FILE_ATTRIBUTE_VIRTUAL 0x00010000
#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
#define FILE_NOTIFY_CHANGE_SIZE 0x00000008
#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
#define FILE_NOTIFY_CHANGE_CREATION 0x00000040
#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
#define FILE_ACTION_ADDED 0x00000001
#define FILE_ACTION_REMOVED 0x00000002
#define FILE_ACTION_MODIFIED 0x00000003
#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
#define MAILSLOT_NO_MESSAGE ((DWORD)-1)
#define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
#define FILE_CASE_PRESERVED_NAMES 0x00000002
#define FILE_UNICODE_ON_DISK 0x00000004
#define FILE_PERSISTENT_ACLS 0x00000008
#define FILE_FILE_COMPRESSION 0x00000010
#define FILE_VOLUME_QUOTAS 0x00000020
#define FILE_SUPPORTS_SPARSE_FILES 0x00000040
#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
#define FILE_VOLUME_IS_COMPRESSED 0x00008000
#define FILE_SUPPORTS_OBJECT_IDS 0x00010000
#define FILE_SUPPORTS_ENCRYPTION 0x00020000
#define FILE_NAMED_STREAMS 0x00040000
#define FILE_READ_ONLY_VOLUME 0x00080000
#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
#define FILE_SUPPORTS_TRANSACTIONS 0x00200000
#define FILE_SUPPORTS_HARD_LINKS 0x00400000
#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
#define FILE_SUPPORTS_USN_JOURNAL 0x02000000
#define FILE_SUPPORTS_INTEGRITY_STREAMS 0x04000000
这篇关于c++ Windows系统API 获取文件属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!