#1 - 2023-10-21 20:50
烈之斩 (V1046-R MAHORO)
potplayer和mpv都可以,这是什么黑科技

十几个G的视频,可以随便拖动进度条,应该不是缓存

这个问题我好奇很久了 是Windows底层什么东西吗
#2 - 2023-10-21 21:03
(mEtAyAyYEaye sphaela/.)
具体是不是这样做的我不清楚,但是的确有对应的API
https://learn.microsoft.com/en-u ... enamed?view=net-7.0
#3 - 2023-10-21 21:12
(旅立ちの日に)
不止是视频,也不止是windows;甚至从回收站删除了也能播
(小白路过,我猜想改名和移动位置无非就是改变了所在目录而已
#4 - 2023-10-21 21:17
(还是铃菜头像好看(都是我老婆.jpg)
就算没学windows操作系统,也能想象windows可以把文件索引处理成了两层吧,一方面是名称索引,通过路径拿文件基础信息。另一层是磁盘索引,从文件信息拿在实际的磁盘上的具体文件数据加载进内存。
你打开视频的时候,播放器已经通过名称路径拿到文基础件信息了,这时候它通过这层信息去找硬盘上的文件数据来加载,之后不管你改啥名字,实际文件在硬盘的位置也是不会变的,变的只有表层索引。
#4-1 - 2023-10-21 21:52
烈之斩
这个道理能理解,但是大部分软件哪怕是只读也不支持这样,为何?
#4-2 - 2023-10-21 22:25
snylonue
烈之斩 说: 这个道理能理解,但是大部分软件哪怕是只读也不支持这样,为何?
文件 api 可以指定打开时共享读/写/删除
#4-3 - 2023-10-21 22:34
kikyouflower
烈之斩 说: 这个道理能理解,但是大部分软件哪怕是只读也不支持这样,为何?
完全没看懂你在说啥啊,只读权限和你主楼提的有啥关系
#4-4 - 2023-10-21 23:38
烈之斩
kikyouflower 说: 完全没看懂你在说啥啊,只读权限和你主楼提的有啥关系
就是说大部分程序在打开A文件的时候根本不允许你移动这个A文件(哪怕是只读),更不要说移动后还能用了

我说的只读不是指权限的只读,是指read only的操作
#4-5 - 2023-10-21 23:41
烈之斩
另外说到“实际文件在硬盘的位置不变”,倒似乎没有这么简单,因为跨盘移动也是可以继续读取的。
#4-6 - 2023-10-21 23:52
CureDovahkinn🤔
烈之斩 说: 另外说到“实际文件在硬盘的位置不变”,倒似乎没有这么简单,因为跨盘移动也是可以继续读取的。
跨盘移动就是复制到那个盘然后这个盘的删了,我不信掉盘了还能放(bgm38)
#4-7 - 2023-10-22 00:04
卯月加油努力
烈之斩 说: 另外说到“实际文件在硬盘的位置不变”,倒似乎没有这么简单,因为跨盘移动也是可以继续读取的。
卧槽,好像真是这样,震了个惊
#4-8 - 2023-10-22 00:07
卯月加油努力
烈之斩 说: 另外说到“实际文件在硬盘的位置不变”,倒似乎没有这么简单,因为跨盘移动也是可以继续读取的。
是不是windows文件系统维护了一个全局的打开文件信息哈希表,存放文件的磁盘位置,然后读写api是拿文件句柄查这个表,移动文件的api会拿新的磁盘位置更新这个表
#4-9 - 2023-10-22 00:16
卯月加油努力
看动画好累 说: 是不是windows文件系统维护了一个全局的打开文件信息哈希表,存放文件的磁盘位置,然后读写api是拿文件句柄查这个表,移动文件的api会拿新的磁盘位置更新这个表
虽然更新这个表会导致阻塞播放器的读,但因为有缓存所以感受不出来,如果在播放的时候文件的移动还没有完成会怎么样?
#4-10 - 2023-10-22 00:33
kikyouflower
烈之斩 说: 就是说大部分程序在打开A文件的时候根本不允许你移动这个A文件(哪怕是只读),更不要说移动后还能用了

我说的只读不是指权限的只读,是指read only的操作
这个很好理解啊,就是所谓的底层逻辑可以但是权限不允许做这种操作。本身windows系统就是把基础索引信息和实际文件硬盘映射分开的,这个是解释你主楼的为什么还可以播放,因为修改索引信息不影响实际文件。在你调用表层索引的时候也可以选择把索引条目锁住时不允许修改操作,因为他把这方面的权限禁了,这个是解释为什么有些软件运行软件时禁止修改文件。
#4-11 - 2023-10-22 00:50
烈之斩
kikyouflower 说: 因为他把这方面的权限禁了,这个是解释为什么有些软件运行软件时禁止修改文件。
你这等于没解释,我不是问文件为什么不能移动(知道是因为被软件锁定了),而是问他们为什么要去锁定。换句话说为什么不是所有软件都像 MPV 这样,明明技术上可以实现
#4-12 - 2023-10-22 01:20
kikyouflower
烈之斩 说: 你这等于没解释,我不是问文件为什么不能移动(知道是因为被软件锁定了),而是问他们为什么要去锁定。换句话说为什么不是所有软件都像 MPV 这样,明明技术上可以实现
你主楼问什么黑科技,我的意思就是说这个东西没有什么黑科技,windows底层本来就能做到。
锁定索引文件本身属于一种保障程序运行安全的操作,比如系统调用的时候往往不是单一的而是综合或者有顺序的还有即时的,大型程序往往有多个进程在调用多个文件,为了确保大家都拿到同样的索引信息,他会要求在一个调用了之后就把这个文件索引修改权限锁定,因为如果文件名变了就会影响的其他进程的正常运行。等等很多很多的理由。
#5 - 2023-10-21 21:41
(未来一定属于美少女撕逼吵架。)
1. 只要打开文件时指定共享方式 "FILE_SHARE_DELETE",其他进程(如文件管理器)就能拿到删除权限,从而进行删除/重命名。
2.若指向文件的句柄依然存在,数据保持有效。
#6 - 2023-10-21 21:49
(婆罗门,指脑婆罗列不完)
你播放时粉碎下文件就会发现播不了了(bgm24)
#7 - 2023-10-21 22:26
同样比较好奇,翻了下mpv的源码,最底层应该是调用了ffmpeg的avio_open2函数读取的文件数据,至于ffmpeg是怎么封装实现的以我的水平一时半会儿估计看不懂就不看了(bgm38)不过这块资料貌似挺多的,继续查起来应该不会太难吧
#8 - 2023-10-21 22:53
大概传统Win32程序的默认逻辑是“锁定”使用的文件吧,但是至少在现在这个操作在底层不是必须的。
遇到过一个相关问题,一个文件用资源管理器或原生命令行无法删除,但是用MSYS2或WSL的rm就可以删除。检查了下MSYS2的源码发现实现还挺复杂的,注释里提到Win10从某一个版本开始支持了“POSIX删除语义”,就可以直接标记删除,如果不支持会进行一系列看不懂的处理。
#8-1 - 2023-10-22 00:21
烈之斩
很多软件比如常见的文本编辑器,一般是不锁定(也就是你可以移动),但是不会去追踪你移动过后的文件,只是会提示你文件已删除(然后使用他自己缓存的文件内容)(bgm38)
#9 - 2023-10-21 23:08
(Chasing in the moonlight.)
我前段时间也发现了,我以为是读在内存里但是看了占用发现不是这样。
#10 - 2023-10-22 00:04
试试:

#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);
    }
}

大多数软件不支持的真正原因:因为 win32 又臭又长大家都选默认参数(bgm38)
#10-1 - 2023-10-22 01:11
Nostop
太真实了,能调别人封好的我绝对不会自己去查资料撸
#11 - 2023-10-22 23:42
原来 windows 支持这样做啊……