讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何获取文件的NTFS压缩属性或加密属性_GetFileAttributes【实战】

浅磊酱_2011

浅磊酱_2011

发布时间:2026-04-05 23:22:03

|

925人浏览过

|

来源于php中文网

原创

GetFileAttributes无法判断NTFS压缩或加密状态,因其不返回FILE_ATTRIBUTE_COMPRESSED和FILE_ATTRIBUTE_ENCRYPTED;须用CreateFile+GetFileInformationByHandle配合GetVolumeInformation确认NTFS卷后获取真实属性。

c++如何获取文件的ntfs压缩属性或加密属性_getfileattributes【实战】

如何用 GetFileAttributes 判断 NTFS 压缩或加密状态

GetFileAttributes 本身**无法直接区分压缩或加密**,它只返回一个整数,其中 FILE_ATTRIBUTE_COMPRESSED 和 FILE_ATTRIBUTE_ENCRYPTED 是两个独立标志位——但这两个值在 Windows API 中**实际不会被 GetFileAttributes 设置**。这是最常踩的坑:调用后发现这两个位永远是 0。

原因在于:GetFileAttributes 读取的是文件系统元数据中“通用属性”字段,而 NTFS 的压缩/加密属于**可选的、需额外查询的扩展属性**,必须用 GetFileInformationByHandle 配合 BY_HANDLE_FILE_INFORMATION 结构体,再结合 GetVolumeInformation 确认卷是否支持 NTFS 才能可靠获取。

正确获取压缩/加密状态的三步实操

绕过 GetFileAttributes 的局限,用句柄方式查:

  • 先用 CreateFile 以 GENERIC_READ 和 FILE_SHARE_READ 打开文件(注意加 FILE_FLAG_BACKUP_SEMANTICS 才能打开目录)
  • 调用 GetFileInformationByHandle,检查返回的 dwFileAttributes 字段 —— 这次它**真会包含 FILE_ATTRIBUTE_COMPRESSED 和 FILE_ATTRIBUTE_ENCRYPTED**
  • 若返回失败且 GetLastError() 是 ERROR_ACCESS_DENIED,说明权限不足(尤其加密文件),可尝试加 SE_BACKUP_NAME 权限或改用 BackupRead

示例关键逻辑:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
HANDLE h = CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_READ, nullptr,
                      OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr);
if (h != INVALID_HANDLE_VALUE) {
    BY_HANDLE_FILE_INFORMATION info = {};
    if (GetFileInformationByHandle(h, &info)) {
        if (info.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) {
            // 真实压缩
        }
        if (info.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) {
            // 真实加密
        }
    }
    CloseHandle(h);
}

为什么 GetFileAttributesEx 也不行

GetFileAttributesEx 看似更现代,但它底层仍走同一套路径,对 NTFS 扩展属性同样无感知。它返回的 WIN32_FILE_ATTRIBUTE_DATA 结构体里,dwFileAttributes 字段和 GetFileAttributes 完全一致 —— 压缩/加密位恒为 0。别被函数名迷惑。

唯一例外是:如果文件本身被设置为“系统压缩”(如通过 compact /c 后未重启资源管理器),某些旧版 Windows 可能短暂缓存错位,但这属于 bug 行为,不可依赖。

实际开发中容易忽略的兼容性点

NTFS 属性只对 NTFS 卷有效;FAT32/exFAT 卷上这两个标志位始终不生效,即使 GetFileInformationByHandle 返回了非零值,也可能是误报(比如卷标被错误解析)。务必先调用 GetVolumeInformation 检查 lpFileSystemNameBuffer 是否为 L"NTFS"。

另外,符号链接(symlink)和硬链接的行为不同:对 symlink 调用 GetFileInformationByHandle 默认解析目标,若要查链接自身属性,得加 FILE_FLAG_OPEN_REPARSE_POINT;而硬链接共享同一份 MFT 记录,属性完全一致。

加密文件还涉及 EFS 密钥绑定,进程若没加载对应用户上下文(比如服务进程跑在 LocalSystem 下),GetFileInformationByHandle 可能静默失败或返回 0 —— 这时候不是代码错了,是运行环境缺凭据。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4574

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4711

2025.07.04

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3199

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2758

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1488

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2539

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3270

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1597

2023.08.10

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn