2013-06-19 2 views
0

FtpWebRequest을 사용하여 ftp에서 내 파일을 다운로드하고 있습니다. 그러나, 응용 프로그램이 내가 파일을 쓰는 것을 선언하는 라인 FileStream에 갔을 때. 다음은 UnauthorizedAccessException : 경로에 대한 액세스가 거부되었습니다. winform

내 다운로드 기능입니다 :

public void Download(List <string> path) 
     { 
      try 
      { 
       string timenow = DateTime.Today.Year.ToString() + "_" + DateTime.Today.Month.ToString() + "_" + DateTime.Today.Day.ToString() + "_" + DateTime.Today.Hour.ToString() + "_" + DateTime.Today.Minute.ToString() + "_" + DateTime.Today.Second.ToString(); 
       DirectoryInfo dir = new DirectoryInfo(@"C:\StudySystemFile\" + timenow); 
       if (!dir.Exists) 
        dir.Create(); 

       foreach (string p in path) 
       { 
        FtpWebRequest request; 
        request = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftp.Hostname + p)); 
        request.Credentials = new System.Net.NetworkCredential(ftp.FtpAccount, ftp.FtpPassword); 
        request.Method = WebRequestMethods.Ftp.DownloadFile; 
        request.KeepAlive = false; 
        request.UseBinary = true; 
        FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

        Stream reader = response.GetResponseStream(); 
        FileStream file = new FileStream(@"C:\StudySystemFile\" + timenow, FileMode.Create, FileAccess.ReadWrite); 

        byte[] buffer = new byte[1024]; 
        int bytesRead = reader.Read(buffer, 0, buffer.Length); 

        while (bytesRead > 0) 
        { 
         file.Write(buffer, 0, bytesRead); 
         bytesRead = reader.Read(buffer, 0, buffer.Length); 
        } 

        reader.Close(); 
        file.Close(); 
        response.Close(); 
        Console.WriteLine(p); 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Windows.Forms.MessageBox.Show(ex.Message); 
      } 
     } 
+0

사용자에게 파일을 저장할 위치를 묻거나 응용 프로그램 데이터와 같은 위치에 저장하거나 응용 프로그램에 높은 권한이 있음을 확인합니다 (그래도 안티 바이러스로 인해 액세스가 차단 될 수 있음). –

답변

0

어떤 사용자 프로그램이없이이 파일을 만들 수 있습니다로 실행 폴더가 존재하는지 C:\StudySystemFile\ 검사에서 파일을 만들 수있는 권한과이없는 프로그램을 실행하는 사용자 UAC 프롬프트.

Create()으로 폴더를 만들 때 파일에 대한 쓰기 권한이없는 C:\에서 사용 권한을 상속하는 경우 폴더 생성 권한 만 얻을 수 있습니다.

프로그램 외부에 폴더를 만들어야하거나 Create()으로 전화 할 때 set the permissions이 필요합니다.

+0

안녕하세요, @ 스캇 귀하의 답장을 보내 주셔서 감사 드리며,'DirectoryInfo'에 의해 생성 된 디렉토리가'읽기 전용 '임을 발견했습니다 – CYB

0

사용자는 반드시 UnauthorizedAccessException을 가져야합니다. I/O 오류 또는 특정 유형의 보안 오류로 인해 운영 체제가 액세스를 거부 할 때 예외가 발생합니다.

분명히 허가 문제입니다.

Vista/Windows 7/8의 경우 C:\ 드라이브는 시스템 드라이브로 간주되므로 직접 파일을 만들기 위해 프로세스에 대한 관리자 권한이 필요합니다.

관리자 또는 Run Visual Studio as Administrator (으)로 프로세스를 실행하면 정상적으로 작동합니다.

+1

관리자 권한으로 실행하는 대신 올바른 권한으로 폴더를 올바르게 만드는 것이 더 낫습니다. –

+0

답장을 보내 주셔서 감사합니다.하지만 Scott과 똑같이 생각했습니다. – CYB

+0

@CYB 이미 코드에서'ReadWrite Access'를 사용하여 파일을 만들고 있습니다. 따라서 VS를 실행중인 사용자는 관리자 권한이 없습니다. 그래서 유일한 옵션입니다. –

0

응용 프로그램에 해당 디렉토리에 쓸 수있는 권한이 없습니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고 새 Application Manifest File을 추가하여 UAC 프롬프트를 강제로 적용 할 수 있습니다. 이 파일에서 관리자 권한이 필요하지 않는 디렉토리에 기록하는 것

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

더 좋은 아이디어로

<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 

를 교체합니다.

0

어떤 Framework 버전을 사용하고 있습니까? 어떤 설치/실행 방법을 사용하고 있습니까? (즉, clickonce) 다른 포스터가 제안한 것처럼 C : 드라이브의 해당 폴더에 대한 사용 권한을 확인 했습니까? 폴더를 마우스 오른쪽 버튼으로 클릭하고 보안 탭을 확인한 다음 로그인 한 사용자가 폴더에 대한 읽기 권한과 수정 권한을 가지고 있는지 확인하십시오.

파일을 임시로 필요로하는 경우에는 IsolatedStorage에 기록하십시오. How to store and retrieve data in Isolated Storage File?

관련 문제