GetFileAttributes

基本概念

GetFileAttributesWindows系统提供的一个文件操作API函数,用于获取指定文件或目录的属性信息。它可以判断文件是否存在、是否为目录、是否为只读文件等多种属性。
GetFileAttributes是一个宏,根据项目是否定义UNICODE宏,会映射到宽字符版本(GetFileAttributesW)或ANSI版本(GetFileAttributesA)。

基本语法

1
2
3
4
5
6
7
DWORD GetFileAttributesW(
[in] LPCWSTR lpFileName //文件或目录的名称
);

DWORD GetFileAttributesA(
[in] LPCSTR lpFileName
);

返回值
成功:返回一个DWORD类型的值,该值是文件属性的组合(多个属性通过位或|组合)。
失败:返回INVALID_FILE_ATTRIBUTES,此时可通过GetLastError()获取具体错误原因(如文件不存在、权限不足等)。

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <Windows.h>
#include <stdio.h>

int main() {
// 要查询的文件/目录路径
LPCWSTR path = L"C:\\example.txt"; // Unicode 路径(L前缀表示宽字符)

// 调用API获取属性
DWORD attributes = GetFileAttributesW(path);

// 检查是否获取成功
if (attributes == INVALID_FILE_ATTRIBUTES) {
DWORD errorCode = GetLastError();
printf("获取属性失败!错误码:%d\n", errorCode);
return 1;
}

// 解析属性(使用位运算判断)
printf("路径:%ls 的属性信息:\n", path);

if (attributes & FILE_ATTRIBUTE_DIRECTORY) {
printf("类型:目录\n");
} else {
printf("类型:文件\n");
}

if (attributes & FILE_ATTRIBUTE_READONLY) {
printf("状态:只读\n");
}

if (attributes & FILE_ATTRIBUTE_HIDDEN) {
printf("状态:隐藏\n");
}

if (attributes & FILE_ATTRIBUTE_SYSTEM) {
printf("状态:系统文件\n");
}

return 0;
}

SetFileAttributes

基本概念

SetFileAttributesWindows系统中与GetFileAttributes对应的API函数,用于设置文件或目录的属性(如只读、隐藏、系统文件等)。它可以修改文件的各种状态标识,是文件属性管理的核心工具。
SetFileAttributes是一个宏,根据项目是否定义UNICODE宏,会映射到宽字符版本(SetFileAttributesW)或ANSI版本(SetFileAttributesA)。

基本语法

1
2
3
4
5
6
7
8
9
BOOL SetFileAttributesW(
[in] LPCWSTR lpFileName, //要设置其属性的文件的名称
[in] DWORD dwFileAttributes//设置属性
);

BOOL SetFileAttributesA(
[in] LPCSTR lpFileName,
[in] DWORD dwFileAttributes
);

可设置的常见属性
常量 值(十六进制) 说明
FILE_ATTRIBUTE_READONLY 0x00000001 设置为只读(取消时需清除该位)
FILE_ATTRIBUTE_HIDDEN 0x00000002 设置为隐藏文件
FILE_ATTRIBUTE_SYSTEM 0x00000004 设置为系统文件
FILE_ATTRIBUTE_ARCHIVE 0x00000020 设置为归档文件(通常用于标记需备份的文件)
FILE_ATTRIBUTE_NORMAL 0x00000080 普通文件(无特殊属性,必须单独使用)

通过位或|组合多个属性。

简单示例

设置为”只读+隐藏”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Windows.h>
#include <stdio.h>

int main() {
LPCWSTR path = L"C:\\test.txt"; // 目标文件路径

// 设置属性:只读 | 隐藏(通过位或组合)
BOOL success = SetFileAttributesW(path, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN);

if (!success) {
DWORD error = GetLastError();
printf("设置属性失败!错误码:%d\n", error);
return 1;
}

printf("文件属性设置成功!\n");
return 0;
}

取消只读属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <Windows.h>
#include <stdio.h>

int main() {
LPCWSTR path = L"C:\\test.txt";

// 1. 获取当前属性
DWORD currentAttr = GetFileAttributesW(path);
if (currentAttr == INVALID_FILE_ATTRIBUTES) {
printf("获取属性失败!错误码:%d\n", GetLastError());
return 1;
}

// 2. 清除“只读”属性(保留其他属性)
DWORD newAttr = currentAttr & ~FILE_ATTRIBUTE_READONLY; // 位运算清除指定位

// 3. 设置新属性
if (!SetFileAttributesW(path, newAttr)) {
printf("取消只读属性失败!错误码:%d\n", GetLastError());
return 1;
}

printf("已取消只读属性!\n");
return 0;
}

设置为”普通文件”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <Windows.h>
#include <stdio.h>

int main() {
LPCWSTR path = L"C:\\test.txt";

// 设置为普通文件(仅能单独使用)
if (!SetFileAttributesW(path, FILE_ATTRIBUTE_NORMAL)) {
printf("设置失败!错误码:%d\n", GetLastError());
return 1;
}

printf("文件已设置为普通属性(无只读/隐藏等)!\n");
return 0;
}