パスへのアクセスが拒否されるのはなぜですか?


156

ファイルを削除しようとすると問題が発生しますが、例外が発生します。

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

また、削除しようとしているフォルダがネットワークサービスを完全に制御できることにも注意してください。

完全な例外メッセージは次のとおりです。

System.UnauthorizedAccessException:パス 'C:\ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg'へのアクセスが拒否されました。System.IO .__ Error.WinIOError(Int32 errorCode、String maybeFullPath)at System.IO.File.Delete(String path)at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(Object sender、EventArgs e)in C:\ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs:line 242

何か案は?


4
例外について明確でないものは何ですか?アプリケーションが実行されているアカウントには、ファイル/フォルダーへのアクセス権限がありません。
オデッド

8
私は例外が言っていることを理解しています。問題は、この機能がシステムを使用して画像を変更する必要がある一部のユーザーによって使用されていることです。その一部は、古いイメージを削除して新しいイメージを保存することにより、イメージを置き換えることです。
Nick gowdy

フォルダへのアクセス許可を確認してください。プロパティウィンドウのセキュリティタブを使用して、フォルダに適切なアクセス許可を付与します
gasroot

6
例外はまったく有益ではありません。それはあなたに教えません:A.どのプリンシパルがリソースにアクセスしようとしているのかB.どのような許可が必要ですか?確認するには、Windows SysInternalsをインストールし、パスアクセスを監視する必要があります。
ATL_DEV 2017年

回答:


184

File.Deleteメソッドによると...

UnauthorizedAccessException4つのことの1つを意味します。

  • 呼び出し元には必要な権限がありません。
  • ファイルは、使用中の実行可能ファイルです。
  • パスはディレクトリです。
  • パスは読み取り専用ファイルを指定しました。

77
パスはディレクトリです。私にとって恥ずかしいこと:/
G

4
昨日のfacepalmで私に起こりました。私はこのあいまいな例外メッセージが嫌いです:(
Broken_Window

1
私は6時間以上も苦労していて、あなたの応答を見た後、パスがディレクトリであることがわかりました... ton ton @CrazyTim ..
User M

6
Path is a directory.このヒントをありがとう:)それは私を助けました。
シドロン2017年

8
あら...パスはディレクトリです。マイクロソフトに感謝します。それは非常に不正なアクセスです。
SeriousM 2018

181

私も問題を抱えていたため、この投稿につまずきました。コピー/削除の前後に次のコード行を追加しました。

削除する

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

コピーする

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
「Everyone」にフォルダへの完全なアクセス許可を与えましたが、成功しませんでした。どういうわけか、これらのファイル属性は機能しました。ありがとう。MSが最終的に適切なセキュリティモデルに落ち着くことを願っています。コピー/削除が数年ごとに爆発する理由を理解しようとすると、控えめに言ってもイライラします。
Steve

13
私はFile.Copyにしようと、読み取り専用ファイルを上書きして... -通常は私のためのトリックだったのsetAttributes
トム・ハンター

6
パスへのアクセスが拒否されても、ファイルが単に読み取り専用であるとは限りません(実際にはパスへのアクセス権があるためです!)私の意見では、エラーメッセージは変更する必要があります。とにかくヒントをありがとう!
MBoros 14

1
プログラムを管理者として実行したところ、問題は解決しました。
サンティアゴビジャフエルテ

5
コピー操作後に属性を設定するとどのように役立ちますか?プログラムはすでにcopyステートメントでクラッシュしませんか?削除操作と同じように、コピー操作の前にする必要がありますか?
Vibhore Tanwer

31

これは古い問題ですが、検索中に遭遇しました。SaveAsの保存パスに実際のファイル名コンポーネントが欠落していることがわかりました...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD

18

ユーザーがWebサイトに接続しようとすると、IISはIUSER_ComputerNameアカウントに接続を割り当てます。ここで、ComputerNameはIISが実行されているサーバーの名前です。既定では、IUSER_ComputerNameアカウントは、Guestsグループのメンバーです。このグループにはセキュリティ制限があります。そのフォルダーへのIUSER_ComputerNameへのグランドアクセスを試みます

これは、IISのセキュリティについて非常によく説明された回答です

お役に立てれば


この助けてくれてありがとう.. IIS_IUSRSユーザーのアクセス許可。
トム

13

Visual Studioを右クリックし、[ 管理者として実行 ]をクリックし ます。


これは、ローカル管理者であるWindows 8.1 EnterpriseマシンでのFile.Moveの問題の解決策であり、他にファイルに対するハンドルがありませんでした。
ロバートカー

13

宛先がファイルであることを理解していなかったため、エラーが発生しました。2番目のパラメーターとしてフォルダーがありました(cmdで機能します)。そして私が得たUnhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.C#があるためFile.Move、あまりにも最初のパラメータのが、2番目のためだけではなく、そこにファイルを望んでいる、とあなたが2番目のパラメータとしてディレクトリを置けば、のようにファイルの書き込みをしようとしているc:\crpあなたはというディレクトリを持っているときにc:\crp

これは間違っているでしょう File.Move(args[0],"c:\\crp");

だから、これは正しいでしょう File.Move(args[0],"c:\\crp\\a.a");

同じことが当てはまります File.Copy


1
ありがとうございました!これにより、APIがディレクトリとして指定した宛先を期待し、ファイル名を含める必要があることに気付かなかった(オブジェクト自体にファイル名が関連付けられているため)という問題を間接的に解決しました。
オースティンサルガット2017年

7

これが問題のあるIIS Webサイトである場合は、サイトまたはアプリケーションが使用するアプリケーションプールの詳細設定のIdentityプロパティを確認してください。これはApplicationPoolIdentityに設定されている場合があります。その場合、これはパスにアクセスする必要があるユーザーです。

または、古いスタイルを使用して、IdentityをNetwork Serviceに設定し、Network Serviceユーザーにパスへのアクセスを許可することもできます。


3

削除/保存しようとしているフォルダの権限を変更する必要があります。含まれているフォルダーを右クリックし、[セキュリティ]タブを使用して、アプリケーションを実行しているユーザーの変更権限を許可します。


これは、作業機械であり、彼はただのユーザーの場合は、我々は唯一の前提として残されているので、あなたは...彼らはおそらく理由でそのようセットアップのアクセス許可を設定..彼は自分のマシンの管理者であると仮定されている
メソッド・マン

1
作業機で、パワーユーザーです。管理者としてログインしていません。画像フォルダのプロパティが変更され、ネットワークサービスが完全にアクセスできるようになりました。しかし、それでも違いはありませんでした。
Nick gowdy

1
フォルダへのフルアクセス権を持つ「Everyone」と「voilá」を追加しました
MarceloBarbosa

3

I / Oエラーまたは特定の種類のセキュリティエラーのためにオペレーティングシステムがアクセスを拒否したときにスローされる例外。

私は同じことを打った。ファイルが非表示ではないことを確認してください。


3

私のウィンドウサービスが例外をスローし始めたときにもこの問題に直面しました

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

したがって、解決策として、サービスに関連付けられているユーザーアカウントを確認しました。

ここに画像の説明を入力してください

だから私の場合、それはネットワークサービスでした

次に、フォルダーのプロパティに移動して、関連付けられているユーザーアカウントも[権限]タブに存在するかどうかを確認しました。私の場合はそれが欠落していて、追加したときに問題が修正されました。

詳細については、以下の画面キャプチャを確認してください

ここに画像の説明を入力してください


3

私も同じ問題で、ファイルではなくフォルダを指していた。

パスに確認して、パスとファイル名を指定してください

System.IO.File.WriteAllBytes("path", bytearray);

2

ファイルのプロパティを確認してください。読み取り専用がオンになっている場合は、オフにします。これはUnauthorizedAccessExceptionに関する個人的な問題でした。


2

このエラーが発生し、すぐに解決しました。すべてのフォルダが読み取り専用である理由がわかりません。読み取り専用をキャンセルして適用しました。ただし、それでも読み取り専用です。だから私はファイルをルートフォルダに移動しました、それはうまくいきます-奇妙です


2

UnauthorizedAccessException例外は、I / Oエラーまたはセキュリティエラーのためにオペレーティングシステムがアクセスを拒否した場合にスローされます。

ファイルまたはレジストリキーにアクセスする場合は、読み取り専用でないことを確認してください



1

共有サーバー上の新しく移動したWebサイトでも同じ問題が発生しました。Webホストパネル(DotNetPanel)をtrueに設定して、「書き込み権限を許可する」で解決します。したがって、サーバーの構成を確認する価値のあるすべてのコードを確認する前に共有サーバーを使用している場合、時間を大幅に節約できます。


1

コードから共有フォルダーのパスに到達しようとしている場合は、セキュリティタブから物理フォルダーへの適切なアクセス許可を与えるだけでよいことに注意してください。また、[共有]タブを使用して、対応するアプリプールユーザーとフォルダーを「共有」する必要があります。


1

私はこのエラーに直面していました

時にはときに私のパスファイル名CombineFileName = ""

それはなってPath Directoryいないfileような問題です上記

FileNameこのように確認する必要があります

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

ファイルを削除するときに正確なエラーが発生しました。これは、サービスアカウントで実行されているWindowsサービスであり、フォルダーのフルコントロールを持っているにもかかわらず、共有フォルダーから.pdfドキュメントを削除できませんでした。

私にとってうまくいったのは、共有フォルダ>詳細>共有>追加のセキュリティタブに移動することでした。

次に、サービスアカウントを管理者グループに追加し、変更を適用すると、サービスアカウントはそのフォルダー内のすべてのファイルに対してすべての操作を実行できました。


1

UWP(Universal Windows)アプリケーションを作成しようとするユーザーにとって、ファイルのアクセス許可ははるかに制限されており、通常はデフォルトで拒否されます。また、システムユーザーの権限よりも優先されます。基本的にはどちらか一方のファイルにのみアクセスできます

  • インストール場所
  • AppDataの場所
  • ファイルまたはフォルダーピッカーで選択されたファイル
  • アプリマニフェストでリクエストされた場所

詳細については、こちらをご覧ください=> https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

私の場合、問題はノートンでした。私の社内プログラムには適切なデジタル署名がなく、ファイルを削除しようとするとUnauthorizedAccessExceptionが発生しました。

ここに画像の説明を入力してください

通知があれば、そこから処理できます。私の場合、気づいた通知がありませんでした。ノートンがプログラムをブロックしないようにする方法は次のとおりです。

  1. ノートンを開く
  2. 下矢印をクリックします
  3. クリック履歴
  4. プログラムでアクティビティを見つける
  5. [その他のオプション]をクリックします
  6. [除外プロセス]をクリックします

0

サーバーでの展開後にこれを行おうとすると、私も同じ問題に直面しました。

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

IISで管理者を含む他のグループに許可を与えたところ、問題が解決しました。


0

このエラーはデザインモードで発生するのではなく、実行モード... .INIまたは.HTMファイル(構成ファイル、ヘルプファイル)へのアクセスを必要とするクラスメンバーの作成などを行っている場合、宣言内の項目を初期化せずに、後で初期化することができます。 FORM_Load()などで...初期化する場合...ガードIFステートメントを使用します。

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

これにより、MSVS DesignerがデザインモードのときにINIファイルまたはHTMファイルを作成しようとしなくなります。


0

移動または作成された後、フォルダーの名前をすばやく変更しようとすると、このエラーが発生しました。

簡単なSystem.Threading.Thread.Sleep(500);解決策:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

0.5秒間スリープするのではなく、移動する前にフォルダが存在するかどうかを確認した方がいいと思います... OSがビジー状態の場合、前の移動に0.5秒以上かかる場合があり、同じ問題に戻ります。
Paul Zahra 2016年

このコードは非常に危険です。どのような例外がスローされても、RenameFileメソッドを繰り返します。例外の原因が実際の権限の問題である場合、アプリがクラッシュする可能性があります
Hossein Shahdoost

0

私の特定のケースでは、10000個のフォルダを繰り返し作成および削除していました。問題は、メソッドDirectory.Delete(path, true)が戻るものの、基礎となるOSメカニズムがまだファイルをディスクから削除している可能性があることでした。また、古いフォルダーを削除した直後に新しいフォルダーを作成し始めたところ、まだ完全に削除されていないためにロックされているフォルダーがあります。そして、私はSystem.UnauthorizedAccessException: "パスへのアクセスが拒否されました"を取得しています。

ここに画像の説明を入力してください

Thread.Sleep(5000)after Directory.Delete(path, true)を使用すると、その問題が解決します。これは安全ではなく、だれにも使用するように勧めていません。私はここで私の問題を解決して私の答えを改善するためのより良いアプローチを望んでいます。今、私はこの例外が発生する理由を考えています。

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}

0

最初に、ドライブ文字の後にコロン(:)文字がないかどうか、パスを確認してください。コロンがない場合は、そのパスにアクセス/書き込み権限が付与されているかどうかを確認できます。私は同じ問題を抱えていて、コロン、許可、そして他のすべてが大丈夫だった。

C:\folderpath

正常に動作しますが、

C\folderpath .........(missing colon)

アクセス拒否エラーが発生します。


0

System.IO.File.OpenWrite(path)を使用しようとしました

OpenWrite()にディレクトリへのパスを渡すだけだったので機能しませんでしたが、書き込みたいファイルへのすべてのパスが必要です。したがって、UnauthorizedAccessExceptionを回避するには、最後にfilename.extensionを含む完全パスをOpenWriteに渡す必要があります。


0

私も同じ問題を扱っているとこの投稿に出くわしました。ファイルが使用中のため、書き込みができないようです。それを理解することはできませんが、どのプロセスがそれを使用しているか。そのボックスにログインしている他のユーザーをサインアウトしました。それを保持しているユーザーは表示されません。同じものを見つける方法に関する簡単なヒント。

ありがとう、Lakshay(開発者)


回答には新しい質問を投稿しないでください。役立つ情報を含めて、元の投稿者の質問に回答してください。あなた自身の質問については、同じまたは同様の質問を最初にstackoverflowで検索してください。見つからない場合は、このガイドに従って新しい質問を投稿してください。良い質問をする方法
alev

0

この問題を解決するために、System.UnauthorizedAccessExceptionのデバッグ(多くの場合、パスへのアクセスが拒否される)記事のScot Hanselmanアプローチに従います。コード例は次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.