2016-10-30 1 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; 
} 

Первый раз, когда пользователи выбирают файл, он отображается в браузере без проблем. Но если во второй раз (когда веб-браузер все еще показывает один и тот же файл PDF) он говорит

Процесс не может получить доступ к файлу «C: \ Users \ mj.PG \ Documents \ IssuedLetter \ 3.pdf» потому что он используется другим процессом.

Как я могу справиться с ситуацией, если пользователь снова нажмет один и тот же файл, чтобы просмотреть его?

+0

Проверьте, существует ли файл перед записью на него? Или напишите файлы там, поскольку они добавлены в базу данных, а не когда они отображаются. – Rob

+0

Я хочу, чтобы пользователь мог перезаписать файл (возможно, он что-то изменил) – nnmmss

+0

Да, но ваш код не является делая это. В следующий раз, когда кто-то просмотрит его, он будет перезаписан «GetLetterImage». Обращаться с диском, когда пользователь добавляет или редактирует файл, а не читается. – Rob

ответ

1

Есть несколько способов избежать блокировки:

  1. Не использовать промежуточные файлы на всех, использовать DocumentStream свойство WebBrowser и MemoryStream в качестве источника.
  2. Используйте новое временное имя файла для каждой буквы. Не забудьте очистить процедуру при закрытии приложения.
  3. Наиболее гибкий и более трудоемкий способ заключается в том, чтобы внедрить небольшой HTTP-сервер в ваше приложение, например, на основе компонентов OWIN self-hosting. Таким образом, вы также можете создавать современные пользовательские интерфейсы на основе html с аутентификацией, авторизацией и другими функциями. В качестве бонуса ваше приложение может быть доступно с других компьютеров в локальной сети и, если хотите, легко выполнить службу Windows.
Смежные вопросы

 Смежные вопросы