烈之斩 说: 这个道理能理解,但是大部分软件哪怕是只读也不支持这样,为何?
kikyouflower 说: 完全没看懂你在说啥啊,只读权限和你主楼提的有啥关系
烈之斩 说: 另外说到“实际文件在硬盘的位置不变”,倒似乎没有这么简单,因为跨盘移动也是可以继续读取的。
看动画好累 说: 是不是windows文件系统维护了一个全局的打开文件信息哈希表,存放文件的磁盘位置,然后读写api是拿文件句柄查这个表,移动文件的api会拿新的磁盘位置更新这个表
烈之斩 说: 就是说大部分程序在打开A文件的时候根本不允许你移动这个A文件(哪怕是只读),更不要说移动后还能用了 我说的只读不是指权限的只读,是指read only的操作
kikyouflower 说: 因为他把这方面的权限禁了,这个是解释为什么有些软件运行软件时禁止修改文件。
烈之斩 说: 你这等于没解释,我不是问文件为什么不能移动(知道是因为被软件锁定了),而是问他们为什么要去锁定。换句话说为什么不是所有软件都像 MPV 这样,明明技术上可以实现
#include <stdio.h> #include <assert.h> #include <windows.h> int main() { HANDLE handle = CreateFile( "delete_or_rename_me", // 你需要自己先创建这个文件,里面有内容为佳(下面的循环会慢慢打印) GENERIC_READ, FILE_SHARE_DELETE, // 把这个改成 0 试试 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); assert(handle != INVALID_HANDLE_VALUE); while (1) { char c = 0; ReadFile(handle, &c, 1, NULL, NULL); putchar(c); Sleep(1000); } }
我说的只读不是指权限的只读,是指read only的操作
锁定索引文件本身属于一种保障程序运行安全的操作,比如系统调用的时候往往不是单一的而是综合或者有顺序的还有即时的,大型程序往往有多个进程在调用多个文件,为了确保大家都拿到同样的索引信息,他会要求在一个调用了之后就把这个文件索引修改权限锁定,因为如果文件名变了就会影响的其他进程的正常运行。等等很多很多的理由。