2011-05-04 42 views
3

我有几个文件,必须通过VB.net编写的进程定期更新。 这些文件位于服务器上,是许多用户可以访问的域的一部分。这些文件不应该写入,因为它们仅供参考。我需要能够覆盖其中的一些,即使用户打开了它们。是否有可能做到这一点?目前,文件权限并未设置为只读,但只要进程运行的用户仍然有权覆盖它们,我就可以执行此操作。是否可以覆盖当前由另一个用户打开的文件

更新:thx为您的答复。这些文件是pdf,并通过从Windows文件浏览器中单击它们打开。当用户只是在Windows资源管理器中选择文件时,也会发生这种情况。

+1

这取决于如何文件已经由从他们阅读的用户(一个或多个)开幕。你能对此有所了解吗? – 2011-05-04 23:37:00

+1

某些应用程序将(为显然没有很好的理由)打开独占访问的文件。如果是这种情况,那么在文件句柄关闭之前,文件不能被其他进程修改(共享提示甚至没有效果)。在[OpenFile](http://msdn.microsoft.com/en-us/library/aa365430%28v=vs.85%29.aspx)文档中可以找到实际低级别标志的基本概念。 – 2011-05-05 00:25:59

+1

您可能可以覆盖它们,具体取决于它们是如何打开的。但请注意,如果在打开时替换它们,那么打开它们的用户在关闭并重新打开修改的文件之前将不会看到新版本。 – 2011-05-05 00:28:53

回答

2

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

+0

事实上,这也发生在用户只是在Windows资源管理器中选择文件听起来像这个任务是不可能的。 – 2011-05-16 16:25:56

0

有时,当另一个用户有一个文件打开阅读并且无法覆盖它时,仍然可以重命名该文件。因此,如果您发现写入操作由于现有的锁定文件而失败,则可以尝试将现有文件重命名为临时文件名,然后编写新版本。稍后,您可以尝试使用临时文件名删除旧版本。

+0

我试图重命名文件,但它不会让我。我试图用Windows资源管理器,而不是编程方式。 – 2011-05-05 21:17:07

+0

这可能是因为这不会在网络上工作 - 这是我主要用于替换本地计算机上的DLL的一个技巧,而程序会将它们加载执行。 – Eric 2011-05-05 21:40:27

0

如果您尝试修改共享文件并且所述文件由网络上的其他人打开,则您的代码将生成错误。

但是,如果您将try catch块和catch语句忽略“访问路径....”消息的异常。您的更新声明将成功完成。

例如:

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