ローカルファイルにアクセスするとアクセスが拒否される - ASP.NET

ASP.NETでローカルファイルにアクセスするとアクセスが拒否されることがあります。

エラーが発生するコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace iPentecWebSearch
{
  public partial class _default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
       FileStream fs = new FileStream(Request.PhysicalApplicationPath + "test.txt", FileMode.Open);
        try {
          StreamReader sr = new StreamReader(fs);
          string text = sr.ReadToEnd();
          Literal_SearchTag.Text = text;
          sr.Close();
        }
        finally {
          fs.Close();
       }
    }
  }
}

エラーメッセージ

以下のメッセージが表示されWebアプリケーションが実行できません。
エラーメッセージ
パス '(ファイルへのフルパス)' へのアクセスが拒否されました。

原因

FileStream fs = new FileStream(Request.PhysicalApplicationPath + "test.txt", FileMode.Open);
FileStreamなどでFileModeのみを指定してファイルを開いた場合には読み書き込みモードでファイルを開きます。ASP.NETアプリケーションが配置されるIISのコンテンツディレクトリは通常、読み込みのみのアクセス権限のため書き込み権限付きでファイルを開くとファイルアクセスが拒否され上記のメッセージが表示されます。

対策

FileStreamなどでファイルを開く際には読み込み専用モードでファイルを開く動作に変えます。
FileStream fs = new FileStream(
  Request.PhysicalApplicationPath + "test.txt", FileMode.Open, FileAccess.Read);
FileStreamの場合は上記のコードのFileAccessを指定する型のコンストラクタを呼び出し、読み込み専用モードでファイルにアクセスします。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2013-08-19
iPentec all rights reserverd.