【问题标题】:Read from a file which is being used by another process从另一个进程正在使用的文件中读取
【发布时间】:2013-07-20 07:22:29
【问题描述】:

对于我想读取谷歌浏览器缓存文件的应用程序。问题是当 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 未运行时,它可以正常工作。我想要this (FileShare on .net)之类的东西。

我认为 Chrome 将允许共享读取访问,因为我已经看到 this 应用程序这样做了。

编辑:

我想我错了。正如 lulyon 所说,Chrome 似乎锁定了文件。因为我在 vb.net 上试过,比如:

Dim d As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)

上面写着:

The process cannot access the file because it is being used by another process.

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

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

【问题讨论】:

    标签: python .net windows file


    【解决方案1】:

    chrome 可能会阻止您写入它正在使用的缓存文件。尝试制作缓存文件的副本(使用您手头的任何工具(如 cp 命令)),然后对副本执行 I/O。

    一种可能的解释是,当 chrome 获得读、写和附加访问权限时,只需以读权限打开文件,在后台使用 seek 操作读取字节会弄乱自己的阅读内容,因此被拒绝操作系统。

    使用 os.stat(filepath).st_mode; 在调用函数之前检查读取权限,使用默认读取权限打开查找您是否具有读取权限。

    只有在确认你没有读取权限的情况下,我们才能进一步弄清楚为什么chrome会阻止你访问缓存文件,而不是ChromeCacheView。

    【讨论】:

    • 但我不需要写权限。如果 chrome 也阻止了读取访问,那么 ChromeCacheView 之类的应用如何做到这一点?
    • @rahul 所以我们必须弄清楚“权限被拒绝”是什么意思。稍后回复您。
    • @rahul 是因为您的当前用户没有访问包含您的缓存文件的文件夹的权限,还是您的当前用户无法读取您的缓存文件?检查一下。
    • 不,先生,正如我所说,我可以在 chrome 未运行时读取文件
    • @rahul 那么这与您是否需要写权限无关。当chrome获得读、写、追加访问权限时,简单地以读权限打开文件,在后台用seek操作读取字节会弄乱自己的读取内容,从而被操作系统拒绝。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多