2012-01-25 6 views
3

Я использую ASP.NET Webforms с C#. На одной странице я нажимаю кнопку «Отправить», чтобы создать файл на сервере.процесс не может получить доступ к файлу, потому что он используется другим процессом

File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) 
      + landingPage.FriendlyName); 

Это прекрасно работает и создает файл как ожидается. Однако после этого он перенаправляет на другую страницу, которая считывает только что созданный файл.

var landingPageContent 
     = File.ReadAllText(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) 
          + landingPage.FriendlyName); 

Именно тогда я получаю эту ошибку.

Процесс не может получить доступ к файлу 'c: \ code \ Content \ CMS \ LandingPages \ Test2', потому что он используется другим процессом.

Если я перезапущу IIS, тогда процесс освобождает файл, и я могу загрузить эту страницу и просто прочитать файл. Нужно ли что-то делать после File.Create, чтобы закрыть файл перед перенаправлением?

ответ

8

Ты связался с потоком, который был отправлен File.Create? Название немного запутанно (оно происходит полностью из недр WinAPI), но он создает файл и открывает его для написания для вас.

+0

Ах, я даже не заметил, что он вернул поток. Большое спасибо! Приму, когда смогу :) – Chev

6

File.Create возвращает Filstream, попробуйте следующее:

using (FileStream fs = System.IO.File.Create(...)){} 

или короче:

File.Create(...).Dispose(); 
+0

Это тоже работает. После ответа Матти мне было проще сделать «File.Create (.....). Dispose();'. Спасибо, циши. – Chev

3

попробуйте заменить:

File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) + landingPage.FriendlyName); 

с:

using(File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) + landingPage.FriendlyName)) 
{} 

поэтому файл ручка immedately расположен/выпущен

3

Просто закройте его:

var fileStream = File.Create(...); 
fileStream.Close(); 

Если вы делаете что-то с созданным файлом было бы лучше оберточной эту логику с помощью using блока, который, наконец, будет закрывать ручку :

using (var stream = File.Create(...)) 
{ 
    // logic 
} 
Смежные вопросы

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