2012-01-25 34 views
3

C#でASP.NET Webフォームを使用しています。あるページで、送信をクリックしてサーバー上にファイルを作成します。プロセスが別のプロセスで使用されているため、ファイルにアクセスできません。

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

これは同様に動作します。 Mattiの答えの後、私は 'File.Create(.....)。Dispose();'を行う方が簡単だとわかりました。ありがとう。 – Chev

3

交換してください:

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

で:

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

ので、ファイルハンドルはちょうどそれを閉じる

3

をリリース/ immedately配置されている:

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

作成したファイルで何かをやっている場合は、それが最終的にハンドルを閉じてしまうusingブロックすることで、このロジックより良いラッピングだろう:

using (var stream = File.Create(...)) 
{ 
    // logic 
} 
関連する問題