2013-05-19 41 views
3

我正在編寫一個應用程序,需要從當前正在執行文件的網絡目錄複製文件。從UNC路徑複製正在執行的文件

我試圖與

using (var source = new FileStream(fileData.FileName, 
            FileMode.Open, 
            FileAccess.Read, 
            FileShare.ReadWrite)) 

打開文件我打開我創造另一個流複製到文件流之後。

但是,這會引發異常,指出該文件正在被另一個進程使用。我不知道如何解決這個問題。如果我只使用文件資源管理器,它會複製文件。所以我知道這是可能的,只是不確定如何。

編輯: 我也嘗試了簡單的File.Copy(source, destination),我得到了同樣的異常說明該文件正在被另一個進程使用。

+0

卷影複製服務可能會幫助你:http://www.codeproject.com/Articles/22745/Volume-Shadow-Copies-from-NET – k0stya

+0

什麼操作系統是網絡文件服務器和客戶端運行,你必須支持任何一方的任何其他操作系統版本?我問,作爲[SMB VSS](http://technet.microsoft.com/en-us/library/jj612865.aspx)在Windows 2012上可用,將是一個很好的解決方案。 –

+0

安裝程序是在所有機器上與Windows Server 2008同構的服務設置。 – btlog

回答

0

要複製正在使用另一個進程使用的文件,我們必須使用兩個服務在Windows中,你會需要驗證這些服務沒有被禁用:

  • 卷影複製
  • Microsoft軟件卷影複製提供

他們可以保留爲手動啓動,所以他們並不需要運行所有的時間。

爲此,我們可以使用任何第三方工具。 Hobocopy就是其中之一。它將在需要時自動啓動這兩項服務,卷影複製服務完成後將被關閉。

下載鏈接:https://github.com/candera/hobocopy/downloads

解壓縮文件並把它們放入你的項目的lib目錄下。然後使用System.Diagnostics.Process來調用該進程。在你的情況下,只需要使用下面的開關作爲參數:/ Y(不提示,只是複製一切)

命令行語法:

hobocopy [/statefile=FILE] [/verbosity=LEVEL] [ /full | /incremental ] 
    [ /clear ] [ /skipdenied ] [ /y ] [ /simulate ] [/recursive] 
    src dest [file [file [ ... ] ] 

C#代碼:

Process process = new Process(); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.FileName = @"Lib\hobocopy.exe"; 
process.StartInfo.Arguments = @" /y <network-directory> <local-directory> <filename>"; 
process.Start(); 

這將複製任何正在使用或未使用的文件(hobocopy主要着眼於高效複製目錄)到您的目的地。