文件系统基础
- 定义
文件系统:操作系统管理磁盘文件的数据结构与组织方法,决定文件在磁盘存储格式
常见:NTFS、FAT32
| 特性 | NTFS | FAT32 |
|---|---|---|
| 单分区上限 | 2TB | 32GB |
| 单个文件上限 | 支持 > 4GB | 最大 4GB |
| EFS 文件加密 | ✅支持 | ❌不支持 |
| 磁盘配额 | ✅支持 | ❌不支持 |
● EFS 加密:仅 NTFS 可用;加密文件名字显示绿色,加密用户可访问,其他用户拒绝访问
● 磁盘配额:限制用户占用磁盘空间,超出配额拒绝分配空间,在磁盘属性「配额」标签配置
Windows 文件 API(CreateFile/ReadFile 等)对 NTFS、FAT32使用同一套 API,底层差异被系统屏蔽
卷(逻辑驱动器)相关 API
卷 = 逻辑盘(C 盘、D 盘),一块物理硬盘可划分多个逻辑卷
- GetLogicalDrives
● 功能:获取存在的驱动器,返回 DWORD 位掩码,每一位代表 A~Z 盘符
● 示例:返回 13 → 二进制1101→ A、C、D 盘存在
bash
bit3 bit2 bit1 bit0
1 1 0 1
D C B A
- GetLogicalDriveStrings
● 功能:获取全部盘符字符串,缓冲区输出格式:"A:\ \0 C:\ \0 D:\ \0\0"(多个以\0分隔,末尾双\0) - GetDriveType
● 判断驱动器类型
● 返回值:0 未知,1 固定硬盘,2 可移动,3 网络盘,4 光驱,5RAM 盘 - GetVolumeInformation
● 获取卷信息:卷标、卷序列号、最大文件名长度、文件系统名称(NTFS/FAT32)
● ⚠️卷序列号格式化会改变,不是硬盘硬件序列号
目录操作 API
- CreateDirectory 创建文件夹
c
BOOL CreateDirectory(
LPCTSTR lpPathName, // 目录路径
LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性,NULL=默认
);
示例:CreateDirectory(L"C:\A", NULL);
只能创建单层目录;路径分隔符 C 语言写\转义
- RemoveDirectory 删除目录
c
BOOL RemoveDirectory(LPCTSTR lpPathName);
⚠️只能删除空文件夹,目录内有文件会失败
- MoveFile 重命名 / 移动目录 / 文件
c
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);
● 同盘:仅改名;跨盘:复制原文件,再删除源文件
● 可以直接移动带文件的目录
- GetCurrentDirectory / SetCurrentDirectory
● GetCurrentDirectory:获取进程当前工作目录(不是 exe 所在目录!)
● SetCurrentDirectory:修改进程当前目录
相对路径的文件 / 目录操作,以当前工作目录作为基准
文件核心 API
- CreateFile(最重要,创建 / 打开文件、管道、设备)
c
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件路径
DWORD dwDesiredAccess, // 访问权限
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, // 创建行为
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile
);
dwDesiredAccess 访问权限
● GENERIC_READ 只读
● GENERIC_WRITE 只写
● GENERIC_READ | GENERIC_WRITE 读写
dwShareMode 共享模式
● 0:独占打开,别的程序不能读写
● FILE_SHARE_READ:允许其他进程读
● FILE_SHARE_WRITE:允许其他进程写
● FILE_SHARE_DELETE:允许其他进程删除
dwCreationDisposition 创建方式
| 宏 | 作用 |
|---|---|
| CREATE_NEW | 新建,文件已存在则失败 |
| CREATE_ALWAYS | 总是新建,覆盖旧文件 |
| OPEN_EXISTING | 打开已有文件,不存在失败 |
| OPEN_ALWAYS | 打开,不存在就新建 |
| TRUNCATE_EXISTING | 打开并清空原有内容 |
dwFlagsAndAttributes 文件属性
● FILE_ATTRIBUTE_NORMAL 普通文件
● FILE_ATTRIBUTE_HIDDEN 隐藏
● FILE_ATTRIBUTE_READONLY 只读
返回 HANDLE;用完必须 CloseHandle关闭句柄,否则资源泄漏
- 配套文件 API
● ReadFile:读文件
● WriteFile:写文件
● GetFileSize:获取文件大小(返回低 32 位,大文件需要高 32 位参数)
● SetFilePointer:移动文件读写指针
● GetFileAttributes:获取文件属性(只读 / 隐藏 / 目录等)
● CopyFile:复制文件
● DeleteFile:删除文件
● FindFirstFile / FindNextFile:遍历目录下所有文件
注意事项
- 路径:C/C++ 字符串内,反斜杠需要转义 \;长路径可使用\?\前缀,支持 32000 字符
- 错误判断:API 返回失败时,调用GetLastError()查看错误码
- 资源:文件句柄、内核对象用完必须 CloseHandle
- 进程当前目录 ≠ 可执行文件所在目录,不要混淆
总结
- NTFS 独有:EFS 加密、磁盘配额;FAT32 单文件上限 4GB
- 卷 API:GetLogicalDrives(位掩码)、GetVolumeInformation(获取文件系统类型 NTFS/FAT32)
- 目录:CreateDirectory 建文件夹,RemoveDirectory只能删空目录;MoveFile 支持目录改名
- CreateFile 是核心:dwCreationDisposition 决定新建 / 覆盖 / 打开;共享模式控制多进程并发访问
- 文件句柄用完一定要 CloseHandle