【问题标题】:Read-only file in use right after read-only set to false只读文件设置为 false 后立即使用中的只读文件
【发布时间】:2015-03-23 17:54:45
【问题描述】:

我正在尝试使用以下代码删除只读文件。

var fileInfo = new FileInfo(saveLocation);
fileInfo.IsReadOnly = false;
fileInfo.Delete();

到第三行时,抛出如下异常

消息:进程无法访问文件“\\filepath\filename.pdf”,因为它正被另一个进程使用。

注意:\\filepath\filename.pdf 不是实际的文件路径,我只是用它来替换更长的路径

我查过文件,在代码运行前设置为只读,代码运行后就不是了。

我是否认为当文件以只读方式打开时它不被认为是在使用中?我很确定 Microsoft office 文件确实是 .xlsx 文件,但可能不适用于 PDF?

最终,我的目标是能够将此文件的更新版本推送到共享位置,即使某些用户在他们的计算机上打开了该文件,这也是我最初将其设置为只读的原因。

【问题讨论】:

  • 错误信息与文件是否为只读无关。该文件被另一个进程锁定,阻止删除。在您启动程序之前,您的系统上是否正在运行某些东西可能会锁定该文件?
  • 您可以使用 Process Explorer 查看哪个应用程序有打开该文件的句柄:technet.microsoft.com/en-us/sysinternals/bb896653.aspx(使用望远镜)

标签: c# fileinfo


【解决方案1】:

消息:进程无法访问文件 '\filepath\filename.pdf',因为它正被另一个进程使用。

这与只读文件不同。

您可以在代码中找出哪个进程正在锁定文件

https://stackoverflow.com/a/20623311/141172

也可以从命令行查找

更新

根据您的 cmets,您可能希望在处理文件期间对文件进行独占锁定

open file in exclusive mode in C#

Command-line tool for finding out who is locking a file

【讨论】:

  • 我想我的假设是将文件设置为只读会阻止另一个进程锁定文件。这不正确吗?
  • 只读不会阻止另一个进程锁定文件。如果要确保没有其他文件至少可以获得该文件的读锁,则需要获得排他锁。通常只读更多的是仅供参考而不是实际执行,因为其他进程通常有权更改该文件属性(有时会)。
  • 也许是一个单独问题的主题,但有没有办法让文件解锁?
  • 您可以通过自己获取独占、无共享锁来防止另一个进程获得任何锁。我在我的答案中添加了一个链接,显示了如何做到这一点。我不知道有一种机制可以说“根本没有人可以锁定这个文件”,除了首先拒绝访问该文件的权限。
  • 谢谢。问题是我试图删除的文件是在过去一周创建的,所以当这段代码运行时,其他人在一周内打开文件并在他们的计算机上保持打开状态可能已经有一个锁。我可能不得不以另一种方式解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 2021-03-12
  • 1970-01-01
  • 2014-09-26
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多