2016-10-30 17 views
1

我將文件存儲在SQL Server數據庫中,而且如果用戶選擇它們,我也會在我的應用程序中顯示這些文件。這是我所做的:進程無法訪問文件yyyy,因爲它正在被另一個進程使用

LetterBAL letterBal = new LetterBAL(); 
string filter = "Id=" + letterListView.SelectedItems[0].Text; 

Letter letter = letterBal.GetLetterImage(filter);   

string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
path = path + "\\IssuedLetter\\" +letter.Id.ToString() + "." +letter.FileExt;     

webBrowser1.Navigate(path); 


public Letter GetLetterImage(string filter) 
{ 
     LetterDB letterDB = new LetterDB(); 
     Letter letter = letterDB.GetLetterImage(filter); 

     string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     path = path + "\\IssuedLetter"; 
     path = path + "\\" + letter.Id.ToString() + "." + letter.FileExt;    

     using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write)) 
     fs.Write(letter.ltr_Image, 0, letter.ltr_Image.Length);   
     return letter; 
} 

用戶第一次選擇文件,它已被顯示在Web瀏覽器中沒有問題。但是,如果第二次(當網絡瀏覽器仍顯示相同的PDF文件),它說

該進程無法訪問文件「C:\用戶\ mj.PG \文檔\ IssuedLetter \ 3.PDF」因爲它正在被另一個進程使用。

如果用戶再次單擊相同的文件以查看它,我該如何處理這種情況?

+0

在寫入文件之前檢查文件是否存在?或者在文件被添加到數據庫時將文件寫入,而不是當它們顯示時 – Rob

+0

我希望用戶能夠覆蓋文件(也許他已經改變了一些內容) – nnmmss

+0

是的,但是您的代碼不是這樣做。下次有人查看它時,它會被'GetLetterImage'重寫。當用戶添加或編輯文件時處理持久化到磁盤,而不是讀取。 – Rob

回答

1

有幾種方法,以避免阻塞:

  1. 根本不使用中間文件,使用web瀏覽器和的MemoryStream的DocumentStream財產的來源。
  2. 爲每個Letter使用新的臨時文件名。不要忘記應用程序關閉時的清理過程。
  3. 最靈活和最耗時的方法是在您的應用程序中嵌入一個小的http服務器,例如基於OWIN self-hosting組件。因此,您還可以使用身份驗證,授權和其他功能構建基於html的現代用戶界面。作爲獎勵,如果需要,您的應用程序可以從本地網絡中的其他計算機訪問,並輕鬆實現Windows服務。
相關問題