2011-05-04 51 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; 
} 
相關問題