我能否覆盖当前被其他用户打开的文件?

3
我有几个文件需要定期更新,这些文件存储在服务器上,属于许多用户可以访问的域。这些文件只能用于参考,不能被写入。即使用户已经打开了这些文件,我也需要覆盖其中的一些文件。是否可能实现这一点?目前,这些文件的权限没有设置为只读,但只要进程运行的用户仍然有权限覆盖它们,我可以进行此设置。
更新:感谢您的回复。这些文件是pdf格式的,在Windows文件资源管理器中单击打开。当用户仅仅选中该文件时,也会发生这种情况。

1
这取决于读取文件的用户是如何打开它们的。你能解释一下吗? - Will A
1
一些应用程序会(出于不明显的原因)以独占方式打开文件。如果是这种情况,则在文件句柄关闭之前,其他进程无法修改该文件(共享提示甚至没有效果)。有关实际低级标志的基本概念可以在OpenFile文档中找到。 - user166390
1
根据最初打开文件的方式,您可能能够覆盖它们。但是请注意,如果在文件处于打开状态时替换它们,那些正在使用这些文件的用户在关闭并重新打开修改后的文件之前将无法看到新版本。 - Ken White
3个回答

2

这取决于用户在打开文件时使用的共享模式。有关更多信息,请参见FileShare枚举(在处理文件的某些重载中接受)。


这个任务似乎是不可能完成的,因为当用户仅在Windows资源管理器中选择文件时,也会发生这种情况。 - yan bellavance

0
有时候当另一个用户正在读取文件并且你无法覆盖它时,仍然可以将该文件重命名。因此,如果你发现由于已存在的锁定文件而导致写操作失败,可以尝试将现有文件重命名为临时文件名,然后再写入新版本。稍后可以尝试使用临时文件名删除旧版本。

我尝试重命名文件,但它不让我这样做。我是通过Windows资源管理器尝试的,而不是通过编程方式。 - yan bellavance
这可能在网络上不起作用 - 这是我在程序加载DLL以执行时,主要用于替换本地机器上的技巧。 - Eric

0

如果您尝试修改一个共享文件,而该文件已被网络上的其他人打开,则您的代码将生成错误。

但是,如果您使用try catch块,并在catch语句中忽略“访问路径...”消息的异常,您的更新语句将成功执行。

例如:

try
{
    .
    .
    .
    your update statement here
    .
    .
}
catch (Exception ex)
{
    if (ex.Message.IndexOf("Access to path") < 0)
        throw ex;
}

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