c++指针不能直接操作磁盘文件元数据,因其仅指向进程虚拟内存,而元数据由内核在文件系统中维护;必须调用系统api(如stat()、getfileinformationbyhandle())通过指针接收返回数据,修改则需专用函数(如chmod()、setfiletime())。

指针本身不能直接操作磁盘文件元数据
这是关键前提:C++ 中的指针(如 int*、char*)是内存地址的抽象,它不提供对文件系统元数据(如修改时间、权限、大小、inode 号等)的访问能力。试图用裸指针去“指向”或“修改”文件元数据会引发未定义行为——因为那些信息不在进程的虚拟内存空间里,而由内核维护在文件系统结构中。
获取文件元数据必须调用系统 API,不是指针运算
你需要的是系统级接口,而非指针技巧。不同平台有不同函数:
- Linux/macOS:用
stat()或fstat(),传入路径或文件描述符,结果写入struct stat*指针所指向的缓冲区——这里的指针只是接收数据的**输出参数**,不是操作元数据的手段 - Windows:用
GetFileAttributesEx()或GetFileInformationByHandle(),同样需要传入一个结构体指针(如LPBY_HANDLE_FILE_INFORMATION)来接收数据
示例(Linux):
#include <sys>
struct stat sb;
if (stat("/path/to/file", &sb) == 0) {
printf("size: %ld, mtime: %ld\n", sb.st_size, sb.st_mtime);
}
</sys>
注意:&sb 是取地址得到 struct stat*,但整个过程不涉及“用指针修改元数据”,只是把内核返回的数据拷贝进你提供的内存位置。
修改元数据靠专用函数,不是解引用指针
想改权限、时间戳、所有者?必须调用对应函数,不能通过指针写内存实现:
-
chmod()/chown()/utimes()(POSIX) -
SetFileAttributes()/SetFileTime()(Windows)
常见误区:有人误以为拿到 struct stat* 后修改 sb.st_mtime 再传回就能更新时间——不行。那只是改了本地副本,和磁盘无关。必须显式调用 utimes() 并传入正确的时间数组。
为什么容易混淆“指针”和“元数据操作”
因为很多系统函数签名里确实带指针参数(如 stat(const char*, struct stat*)),让人误以为“用了指针就是在操作元数据”。实际上:
- 这些指针全是**被动接收方**,用于存放内核返回的数据
- 没有一个标准 C++ 或 POSIX 函数允许你通过内存地址直接读写 inode、目录项或超级块
- 真要绕过 API 直接操作(比如 mmap 整个 ext4 superblock),需要 root 权限 + 驱动级知识 + 文件系统未挂载,远超普通应用范畴
真正该关注的,是函数调用时机、错误检查(errno)、结构体字段含义(比如 st_mtim.tv_nsec 在不同系统上是否可用),而不是怎么用指针“指向”mtime。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











