读取正在被其他进程使用的文件

4
为了一个应用程序,我想读取谷歌浏览器的缓存文件。问题在于当Chrome正在运行时,这些文件都是打开的,并且可能会被其进程更新。
因此,当我尝试使用以下代码时: data_1 = open("C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Cache\data_1")
它给了我这个错误: IOError: [Errno 13] Permission denied: 'C:\\Users\\user\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cache\\data_1' 由于它说“权限被拒绝”(编辑:我对该文件具有“完全控制”的权限),因此我还尝试在提升的cmd窗口中运行它。同样的情况发生了。当Chrome没有运行时它可以正常工作。我希望能够像.net上的FileShare那样做到共享读取。
我认为Chrome将允许共享读取访问,因为我看到这个应用程序可以这样做。 编辑: 我想我错了。如lulyon所说,Chrome似乎锁定了该文件。因为我在vb.net上尝试了以下内容:
Dim d As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)

它说:

由于文件正在被另一个进程使用,因此该进程无法访问该文件。

最初我认为ChromeCacheView将文件复制到其他位置。 因此,我使用进程监视器进行了深入的研究。 请查看此截图。 那不是意味着两个应用程序共享相同的文件吗?

Process monitor: Chrome and ChromeCacheView

我认为它们之间不会有任何理解,因为ChromeCacheView是第三方应用程序。 那么这怎么可能?

1个回答

1
很可能是Chrome阻止你向其正在使用的缓存文件中写入。尝试使用任何可用工具(如cp命令)复制缓存文件,并使用副本进行I/O。
可能的解释是,当Chrome获得读、写和追加许可时,仅以读权限打开文件,在幕后使用seek操作读取字节会混淆你自己的读取内容,因此被操作系统拒绝。
在调用带有默认读取访问权限的open函数之前,使用os.stat(filepath)。st_mode检查读取权限,以查看是否具有读取许可。
只有确认你没有读取许可,我们才能进一步弄清楚为什么Chrome阻止你访问缓存文件,而不是ChromeCacheView。

不,正如我所说的,即使 Chrome 没有运行,我也可以读取文件。 - Rahul K
@rahul,那不是你是否需要写入权限的问题。当chrome获取读、写和追加访问权限时,仅以读取权限打开文件,在幕后进行的搜索操作会破坏你自己的阅读内容,因此会被操作系统拒绝。 - lulyon
@rahul 在调用函数open时,请先检查读取权限,使用os.stat(filepath).st_mode来获取默认的读取权限,以确定您是否具有读取权限。这将解释一切。 - lulyon
@rahul 刚刚重新编辑了答案,供您审核。很高兴参与这个问题的讨论。我自己也学到了一些东西。 - lulyon
@rahul oct(os.stat(filepath).st_mode)[-3:]; 如果结果是“666”,这是类Unix文件访问权限位。这意味着所有者、组和其他用户都具有读取、写入权限(但不具有执行权限)来访问此文件。检查一下当你的Chrome正在使用这个文件时。顺便说一句,在提问之前多做些研究,而不是在这里空谈。无论如何,我们只是在这里帮忙(没有比你给我们更多线索),解决问题取决于你。每当你解决了问题,请告诉我。 - lulyon
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接