2009-07-21 2 views
9

내가 수동으로 삭제할 수있는 파일에 무단 액세스 예외는 UnauthorizedAccessException 내가 같은 코드

  • 을 얻고 다른 사람의 파일을 삭제할 수있는 폴더에 파일을 삭제하려고합니다. 내가 코드에 의해 삭제 다른 파일
  • 수 있어요 및 파일이 표시되지 않은 폴더에
  • , 나는 독립 PC에 Windows XP를 사용하고 이외의 유일한
  • 읽으면서 나는 할당되지 않은 폴더 또는 파일에 대한 모든 사용 권한.

    protected void DeleteImage(string imageName) 
    { 
        if (imageName != null) 
        { 
         string f = String.Format("~/Images/{0}", imageName); 
         f = System.Web.Hosting.HostingEnvironment.MapPath(f); 
         if (File.Exists(f)) 
         { 
          if (f != null) File.Delete(f); 
         } 
        } 
    } 
    

    왜 이런 일이 일어날 수 : 도움이된다면

  • 다른 프로세스는이 예외 ocurrs이 코드 파일

을 사용하고 있지?

+0

사용 권한 문제와 같은 느낌입니다. 삭제할 수있는 파일과 그렇지 않은 파일에 대해 권한이 어떻게 다릅니 까? –

답변

2

읽기 전용이 아닌 경우 다른 프로세스에서 현재 사용 중일 수 있습니다.

+2

답이 없습니다. 덧글을 달아주세요 – Kiquenet

+0

@Kiquenet : 왜 이것이 대답이되지 않습니까? 사실 내게 무슨 일이 일어 났는가. 실제로, 삭제하려고했던 것은 프로세스 자체였습니다. (실수로 업데이트 스크립트에서 프로젝트를 참조했습니다.) – teynon

0

사용자는 특정 권한으로 로그인해야합니다. 웹 서버는 다른 권한으로 다른 로그인을 가질 수 있습니다. IUSR_XXXX 또는 그와 같은 것으로 시작하는 사용자. 사용자에게 디렉토리에 대한 권한이 있는지 확인하십시오.

파일을 삭제하는 컨텍스트에 대한 정보가 없으면 웹 서버 사용자가 사용자가하는 것보다 파일에 대한 다른 권한이 있다고 가정합니다. 명백한 첫번째 확인

1

... 당신은 파일의 속성을 열고 보안 설정을 살펴

. 사용자가 코드를 실행하고 있습니까 (예 : ASP.NET, 네트워크 서비스/도메인 서비스 계정) 실제로 파일을 삭제할 수있는 권한이 있습니까? 그렇지 않은 경우 변경하고 다시 시도하십시오.

수동으로 삭제하려고 할 때 관리자 권한으로 실행하고 있습니까? 그렇다면 수동으로 삭제할 수 있습니다. ASP.NET을 실행하는 계정으로 삭제하십시오 (System.Web.Hosting.HostingEnvironment.MapPath를 사용하고 있기 때문에 ASP.NET이라고 가정 함).

둘 다 실패하면 다른 것이 있는지 확인하십시오. 프로세스가 실제로이 파일을 사용 중입니다. 알아내는 좋은 도구는 SysInternal 프로세스 모니터입니다. 파일 이름이 들어있는 경로로 필터하면 사용중인 것이 있는지 확인해야합니다. 프로세스를 종료하고 다시 시도하십시오.

+0

sysinternal 도구에 +1 (지금까지는 sysinternal 도구를 사용하는 방법을 알지 못했습니다) – eKek0

+0

사용중인 파일을 삭제하려고하면 UnauthorizedAccessException이 발생합니다 ? 나는 권한의 문제가 아니기 때문에 또 다른 유형의 예외를 기대한다. –

17

동일한 문제가 발생하여 내 자신의 Directory.Delete 래퍼를 작성하는 것이 수정 된 것으로 나타났습니다. 이것은 기본적으로 재귀 : 디렉토리가 읽기 전용 파일을 포함

using System.IO; 

public void DeleteDirectory(string targetDir) 
{ 
    File.SetAttributes(targetDir, FileAttributes.Normal); 

    string[] files = Directory.GetFiles(targetDir); 
    string[] dirs = Directory.GetDirectories(targetDir); 

    foreach (string file in files) 
    { 
     File.SetAttributes(file, FileAttributes.Normal); 
     File.Delete(file); 
    } 

    foreach (string dir in dirs) 
    { 
     DeleteDirectory(dir); 
    } 

    Directory.Delete(targetDir, false); 
} 
+0

http://caioproiete.net/en/csharp-delete-folder-including-its-sub-folders-and-files-even-if-marked-as-read-only/에 대한 설명은 무엇입니까? – Kiquenet

+0

무슨 뜻인지 모르겠다. 나는 그것이 유사한 기능이라고 본다. 그러나 정확하게 같은 것. .. 내가 이것을 전에 사용했을 때, 그것은 잘 움직이게되었다. ... 잠시 그러나 지금 있었다! –

+2

고맙다. 내 문제를 해결했다. –

6

경우가 Directory.Delete를 사용하는 것을 삭제되지 않습니다. 그것은 MS에 의한 어리석은 구현입니다.

인터넷에서이 방법을 제안한 사람은 아무도 없습니다.이 방법을 사용하면 디렉터리를 반복적으로 삭제하지 않고 모든 파일의 특성을 변경할 수 있습니다.여기에 그입니다 :

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

가 나도 같은 문제에 직면하지만, 결국 일반 접근 함께했다

+0

나는 바보 같지는 않다고 생각한다. 수동으로 '삭제'하면 실제로 휴지통으로 옮깁니다. –

+1

@DaveVandenEynde에 달렸습니다. 보통 파일을 영구히 삭제하려면 shift + del을 사용하십시오. – Nothing4You

+0

이것이 내가 찾던 해결책이다. 고마워. – Juran

0

(모든 인터넷을 통해 사용할 수있는, 순간적으로 cmd를 창을 발사하지 조금 변경). 내 코드는 다음과 같습니다.

문자열 pathfile = "C : \ Users \ Public \ Documents \ Filepath.txt";

  if (!Directory.Exists(pathfile)) 
      { 
       File.SetAttributes(pathfile, FileAttributes.Normal); 
       File.Delete(pathfile); 
      } 


       using (FileStream fs = File.Create(pathfile)) 
       { 
        Byte[] info = new UTF8Encoding(true).GetBytes("What Ever Your Text is"); 

        fs.Write(info, 0, info.Length); 
        File.SetAttributes(pathfile, FileAttributes.ReadOnly); 

       }