该进程无法访问yyyy文件,因为它正由另一个进程

时间:2016-10-30 06:36:44

标签: c# sql sql-server visual-studio filestream

我将文件存储在SQL Server数据库中,如果用户选择了文件,我也会在应用程序中显示这些文件。这就是我所做的:

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;
}

用户第一次选择文件时,它已在网络浏览器中显示,没有任何问题。但如果是第二次(当网络浏览器仍显示相同的pdf文件时),则说

  

该进程无法访问文件' C:\ Users \ mj.PG \ Documents \ IssuedLetter \ 3.PDF'因为它正被另一个进程使用。

如果用户再次点击同一文件进行查看,我该如何处理?

1 个答案:

答案 0 :(得分:1)

有几种方法可以避免阻止:

  1. 根本不要使用中间文件,使用WebBrowser和MemoryStream的DocumentStream属性作为源。
  2. 为每封Letter使用新的临时文件名。不要忘记申请结束时的清理程序。
  3. 最灵活,更耗时的方法是在应用程序中嵌入一个小http服务器,例如基于OWIN self-hosting组件。因此,您还可以构建具有身份验证,授权和其他功能的基于html的现代用户界面。作为奖励,您可以从本地网络中的其他计算机访问您的应用程序,并根据需要轻松实现Windows服务。