2013-06-19 6 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

Привет, @Scott Спасибо за ваш ответ, и я обнаружил, что мой каталог, созданный 'DirectoryInfo', является' read-only' – CYB

0

Вы должны получать UnauthorizedAccessException. Исключение, которое вызывается, когда операционная система отказывает в доступе из-за ошибки ввода-вывода или определенного типа ошибки безопасности.

Это явно вопрос разрешения .

В случае Vista/Windows 7/8, C:\ диск рассматривается как системный диск и для его создания требуются права администратора для создания файлов непосредственно под ним.

Попробуйте запустить процесс с администратором или Run Visual Studio as Administrator, и он должен работать.

+1

. Лучше просто создать папку правильно с надлежащими разрешениями вместо запуска в качестве администратора. –

+0

Спасибо за ваш ответ, но я подумал так же, как Скотт. – CYB

+0

@CYB Вы уже создаете файл с 'ReadWrite Access' в своем коде, поэтому дело в том, что ваш пользователь, который работает VS, не имеет прав администратора. Итак, это единственный вариант. –

0

У вашего приложения нет разрешения на запись в этот каталог. Вы можете принудительно вызвать приглашение UAC, щелкнув правой кнопкой мыши на своем проекте и добавив новый Application Manifest File. В этом файле замените

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

с

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

лучшей идеей было бы написать в каталог, который не требует прав администратора.

0

Какую версию Framework вы используете? Какой метод установки/запуска вы используете? (т. е. clickonce). И, как и другой предложенный плакат, вы проверили разрешения на эту папку на своем диске C:? Щелкните правой кнопкой мыши папку и проверьте вкладку безопасности, убедитесь, что пользователь, зарегистрированный в сети, изменил, а также прочитал доступ к папке.

Если вам нужен только файл на временной основе, тогда загляните в письмо Изолированному хранилищу. How to store and retrieve data in Isolated Storage File?

Смежные вопросы