경로에 대한 액세스가 거부 된 이유는 무엇입니까?


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'경로에 대한 액세스가 거부되었습니다. C : \ Users \ gowdyn \의 System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Object sender, EventArgs e)의 System.IO.File.Delete (String path) 문서 \ Visual Studio 2008 \ 프로젝트 \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs : 줄 242

어떤 아이디어?


4
예외에 대해 명확하지 않은 것은 무엇입니까? 응용 프로그램이 실행중인 계정에 파일 / 폴더에 대한 액세스 권한이 없습니다.
Oded

8
나는 예외가 무엇을 말하는지 이해합니다. 문제는이 기능은 시스템을 사용하여 이미지를 수정해야하는 일부 사용자가 사용한다는 것입니다. 그 중 일부는 이전 이미지를 삭제하고 새 이미지를 저장하여 이미지를 교체하는 것입니다.
nick gowdy

폴더에 대한 액세스 권한을 확인하십시오. 속성 창에서 보안 탭을 사용하여 폴더에 적절한 권한 부여
gasroot

6
예외는 전혀 유익하지 않습니다. A. 리소스에 액세스하려는 주체 B. 필요한 권한은 무엇입니까? 이를 위해서는 Windows SysInternals를 설치하고 경로 액세스를 모니터링해야합니다.
ATL_DEV

답변:


184

에 따르면 File.delete를 방법 ...

UnauthorizedAccessException4 가지의 수단의 하나

  • 발신자에게 필요한 권한이 없습니다.
  • 파일이 사용중인 실행 파일입니다.
  • 경로는 디렉토리입니다.
  • 경로가 읽기 전용 파일을 지정했습니다.

77
경로는 디렉토리입니다. 나를 위해 당황 : /
당 G

4
어제 facepalm 나에게 일어났다 . 나는이
모호한

1
나는 6 시간 이상 동안 고군분투했고 당신의 응답을 살펴본 후 경로가 디렉토리라는 것을 보았습니다 ... 톤 @CrazyTim 덕분에 ..
User M

6
Path is a directory.이 팁에 감사드립니다 :) 그것은 나를 도왔습니다.
Sidron

8
오 마이 ... 경로는 디렉토리입니다. Microsoft 감사합니다. 그것은 매우 무단 액세스입니다.
SeriousM

181

나는 또한 문제가 있었 으므로이 게시물에 걸려 넘어졌다. 복사 / 삭제 전후에 다음 코드 줄을 추가했습니다.

지우다

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

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

17
폴더에 '모든 사람'에게 전체 권한을 부여하지 않았습니다. 어떻게 든이 파일 속성이 작동했습니다. 감사. MS가 마침내 적절한 보안 모델을 설정하기를 바랍니다. 복사 / 삭제가 몇 년마다 폭발하는 이유를 알아 내려고 노력하는 것이 가장 어려울 것입니다.
Steve

13
SetAttributes 보통 나를 위해 트릭이었다 - 나는 읽기 전용 파일을 덮어 쓰기 File.Copy하려고했다 ..
톰 헌터

6
경로에 대한 액세스가 거부되었다고해서 파일이 단순히 읽기 전용이라는 것을 의미하지는 않습니다 (실제로 경로에 액세스 할 수 있기 때문에!) 내 의견으로는 오류 메시지가 변경되어야합니다. 어쨌든 힌트 주셔서 감사합니다!
MBoros 14

1
관리자로 프로그램을 실행했는데 문제가 사라졌습니다.
Santiago Villafuerte

5
복사 작업 후 속성을 설정하면 어떻게 도움이됩니까? 프로그램이 이미 복사 문에서 충돌하지 않습니까? 삭제 작업처럼 복사 작업 전에해야합니까?
Vibhore Tanwer

31

이것은 오래된 문제이지만 검색하는 동안 문제가 발생했습니다. SaveAs의 저장 경로에 실제 파일 이름 구성 요소가 누락 된 것으로 나타났습니다 ...

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

18

사용자가 웹 사이트에 연결하려고하면 IIS가 IUSER_ComputerName 계정에 연결을 할당 합니다. 여기서 ComputerName은 IIS가 실행되는 서버의 이름입니다. 기본적으로 IUSER_ComputerName 계정은 Guests 그룹의 구성원입니다. 이 그룹에는 보안 제한이 있습니다. 해당 폴더에 대한 IUSER_ComputerName에 대한 그랜드 액세스를 시도하십시오.

다음 은 IIS 보안에 대한 매우 잘 설명 된 답변입니다.

도움이 되었기를 바랍니다


감사합니다 .. IIS_IUSRS 사용자에 대한 권한.

13

Visual Studio를 마우스 오른쪽 단추로 클릭 하고 관리자 권한으로 실행을 클릭 하십시오.


이것은 로컬 관리자 인 Windows 8.1 Enterprise 컴퓨터의 File.Move 문제에 대한 솔루션이었습니다. 파일에 대한 핸들은 없었습니다.
Robert Kerr

13

대상이 파일이어야한다는 것을 알지 못했기 때문에 오류가 발생했습니다. cmd에서 작동하는 두 번째 매개 변수로 폴더가 있습니다. 그리고 Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.C # File.Move은 첫 번째 매개 변수뿐만 아니라 두 번째 매개 변수를 위해 파일을 원 하기 때문에 디렉토리를 두 ​​번째 매개 변수로 넣으면 c:\crp디렉토리라는 디렉토리가있을 때 와 같이 파일을 쓰려고합니다 c:\crp.

이것은 잘못 될 것입니다 File.Move(args[0],"c:\\crp");

그래서,이 것이 올바른 File.Move(args[0],"c:\\crp\\a.a");

동일 File.Copy


1
감사합니다! 이것은 API가 내가 디렉토리로 지정한 대상을 예상하고 파일 이름을 포함해야한다는 것을 깨닫지 못하는 문제를 간접적으로 해결했습니다 (객체 자체에 관련 파일 이름이 있기 때문에).
Austin Salgat

7

이것이 문제가있는 IIS 웹 사이트 인 경우 사이트 또는 응용 프로그램에서 사용하는 응용 프로그램 풀에 대한 고급 설정의 ID 속성을 확인하십시오. ApplicationPoolIdentity로 설정되어 있으면 경로에 액세스해야하는 사용자입니다.

또는 이전 스타일로 이동하여 ID를 네트워크 서비스로 설정하고 네트워크 서비스 사용자에게 경로에 대한 액세스 권한을 부여 할 수 있습니다.


3

삭제 / 저장하려는 폴더의 권한을 수정해야합니다. 포함 폴더를 마우스 오른쪽 버튼으로 클릭하고 보안 탭을 사용하여 응용 프로그램이 실행되는 사용자의 수정 권한 을 허용 하십시오.


당신은이 작업 기계와 그가 단지 사용자의 경우 우리는 가정 남아 있기 때문에 .. 그들은 아마도 .. 이유가 그런 식으로까지 사용 권한을 설정 ... 그는 자신의 컴퓨터의 관리자가 있다고 가정하고 있습니다
MethodMan

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

I / O 오류 또는 보안 오류로 인해 운영 체제가 액세스를 거부하면 UnauthorizedAccessException 예외가 발생합니다.

파일 또는 레지스트리 키에 액세스하려고하면 읽기 전용아닌지 확인하십시오 .


2

BitDefender를 사용하는 경우 안전 파일 기능이 작업을 차단 했을 가능성이 큽니다 . 이것은 고급 버전과 함께 제공되는 랜섬웨어 보호의 한 형태입니다.

BitDefender에서 애플리케이션 액세스 권한을 부여하고 다시 시도하십시오.

자세한 내용은 이 빗 디펜더 지원 페이지 에서 확인할 수 있습니다 .


1

공유 서버의 새로 이동 한 웹 사이트에서 동일한 문제가 발생했습니다. 웹 호스트 패널 (DotNetPanel) 설정을 통해 "쓰기 권한 허용"을 true로 해결했습니다. 따라서 서버 구성을 살펴볼 가치가있는 모든 코드를 검토하기 전에 공유 서버에 있다면 많은 시간을 절약 할 수 있습니다.


1

코드에서 공유 폴더 경로에 도달하려는 경우 보안 탭을 통해 물리적 폴더에 대한 적절한 권한 만 부여하면 안됩니다. 공유 탭을 통해 해당 앱 풀 사용자와 폴더를 "공유"해야합니다.


1

이 오류가 발생했기 때문에

때때로 때 경로파일 이름CombineFileName = ""

이상같이 문제 가 Path Directory되지 않습니다file

그래서 당신은 FileName이것처럼 확인해야합니다

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

1

파일을 삭제할 때 정확한 오류가 발생했습니다. 서비스 계정으로 실행되는 Windows 서비스로, 폴더에 대한 모든 권한이 있어도 공유 폴더에서 .pdf 문서를 삭제할 수 없습니다.

나를 위해 일한 것은 공유 폴더> 고급> 공유> 추가의 보안 탭으로 이동하는 것입니다.

그런 다음 서비스 계정을 관리자 그룹에 추가하고 변경 사항을 적용하면 서비스 계정이 해당 폴더 내의 모든 파일에서 모든 작업을 수행 할 수있었습니다.


1

UWP (Universal Windows) 응용 프로그램을 만들려는 경우 파일 사용 권한이 훨씬 제한적이며 일반적으로 기본적으로 거부됩니다. 또한 시스템 사용자 권한을 대체합니다. 기본적으로 파일 중 하나에 만 액세스 할 수 있습니다

  • 설치 위치
  • 앱 데이터 위치
  • 파일 또는 폴더 선택기를 통해 선택된 파일
  • 앱 매니페스트에서 요청한 위치

자세한 내용은 여기를 참조하십시오 => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

제 경우에는 문제가 Norton이었습니다. 내 사내 프로그램에 적절한 디지털 서명이 없으며 파일을 삭제하려고 할 때 UnauthorizedAccessException이 발생했습니다.

여기에 이미지 설명을 입력하십시오

그것이 당신에게 통지를 주면, 당신은 거기에서 그것을 처리 할 수 ​​있습니다. 내 경우에는 내가 알았다는 알림을주지 않았습니다. Norton이 프로그램을 차단하지 못하게하는 방법은 다음과 같습니다.

  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 () 등에서 ... 초기화 할 때 ... guard 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 메소드를 반복합니다! 예외의 원인이 실제 권한 문제가 있다면 그것은 충돌로 응용 프로그램을 일으킬 수
호세인 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

이 문제를 해결하기 위해 디버깅 시스템 의 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.