System.UnauthorizedAccessException при записи в путь установки - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь загрузить несколько файлов с SFTP-сервера и сохранить их по пути установки (или на самом деле, ЛЮБОМУ пути на данный момент только для того, чтобы он работал). Однако я получаю исключение UnauthorizedAccess независимо от того, где я пытаюсь сохранить файлы.

Насколько известно, для сохранения файлов в установочном каталоге не требуется специальных разрешений (поэтому я выбрал эту папку).

    Thread myThread = new Thread(delegate() {
        string host;
        string username;
        string password; 

        // Path to folder on SFTP server
        string pathRemoteDirectory = "public_html/uploads/17015/";

        // Path where the file should be saved once downloaded (locally)
        StorageFolder localFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
        string pathLocalDirectory = localFolder.Path.ToString();

        var methods = new List<AuthenticationMethod>();
        methods.Add(new PasswordAuthenticationMethod(username, password));
        //TODO - Add SSH Key auth

        var con = new ConnectionInfo(host, 233, username, methods.ToArray());

        using (SftpClient sftp = new SftpClient(con))
        {
            try
            {
                sftp.Connect();

                var files = sftp.ListDirectory(pathRemoteDirectory);

                // Iterate over them
                foreach (SftpFile file in files)
                {

                    Console.WriteLine("Downloading {0}", file.FullName);

                    using (Stream fileStream = File.OpenWrite(Path.Combine(pathLocalDirectory, file.Name)))
                    {

                        sftp.DownloadFile(file.FullName, fileStream);
                        Debug.WriteLine(fileStream);

                    }

                }

                sftp.Disconnect();
            }
            catch (Exception er)
            {
                Console.WriteLine("An exception has been caught " + er.ToString());
            }
        }
    });

Соединение с сервером все в порядке, исключение происходит в этой строке.

using (Stream fileStream = File.OpenWrite(Path.Combine(pathLocalDirectory, file.Name)))

Я, должно быть, здесь упускаю что-то очевидное, но стоит отметить, что я также пытался писать в специальные папки, такие как рабочий стол, пользовательскую папку документов, а также прямо на диск C: /, все с тем же исключением. Я также работаю с правами администратора, и у меня установлены правильные разрешения в папках.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Оказывается, SFTP считал '.' и «..» в виде файлов и пытается загрузить их, когда очевидно «.» заданная папка SFTP, а «..» - предыдущая папка. Это приводило к исключению разрешений, но не на 100% уверен почему. Просто перебирая файлы, чтобы убедиться, что они не названы '.' или «..» исправил проблему. Код ниже.

               sftp.Connect();

                var files = sftp.ListDirectory(pathRemoteDirectory);

                // Iterate over them
                foreach (SftpFile file in files)
                {

                    if (!file.IsDirectory && !file.IsSymbolicLink)
                    {
                        using (Stream fileStream = File.OpenWrite(Path.Combine(pathLocalDirectory, file.Name)))
                        {
                            sftp.DownloadFile(file.FullName, fileStream);
                            Debug.WriteLine(pathLocalDirectory);

                        }
                    }

                    else if (file.Name != "." && file.Name != "..")
                    {
                        Debug.WriteLine("Directory Ignored {0}", file.FullName);
                    }

                    else if (file.IsSymbolicLink)
                    {
                        Debug.WriteLine("Symbolic link ignored: {0}", file.FullName);
                    }


                }

                sftp.Disconnect();
0 голосов
/ 01 июля 2018

У вас есть несколько проблем здесь. Ссылка на родительскую папку (".."), на которую вы ответили, является одним из блокировщиков, но это не решает более глубокой проблемы, заключающейся в том, что InstalledLocation только для чтения.

Приложения UWP не имеют прямого доступа к большинству расположений файловой системы. По умолчанию они могут читать и записывать в свой каталог ApplicationData и могут читать (но не записывать) из InstalledLocation . Ожидаются сбои для рабочего стола, документов и C: \.

Другие местоположения (включая Рабочий стол, Документы и C :) могут быть предоставлены пользователю в явном виде или с помощью заявленных возможностей приложения. Доступ к ним можно получить через посредник файлов через объект StorageFile.

См. UWP Права доступа к файлу Документация:

Каталог установки приложения доступен только для чтения. Вы не можете получить доступ к каталогу установки через средство выбора файлов.

В долгосрочной перспективе вы захотите загрузить свои файлы куда-нибудь еще, возможно, в одну из папок ApplicationData. Эти папки являются единственными без специальных требований к разрешениям для приложений UWP.

Так почему же это работает для вас сейчас?

Вы сталкиваетесь с особенностью отладки, когда ваше приложение не установлено полностью, а размещено в каталоге проекта VS. Это позволяет приложению выполнять запись в каталог поэтапной установки, но после правильного развертывания в Program Files \ WindowsApps запись в InstalledLocation завершится неудачей.

0 голосов
/ 28 июня 2018

Попробуйте Path.GetTempPath () ;. У вас должно быть разрешение там.

Когда говорится, что у вас нет разрешения, у вас нет. 8 -)

Кроме того, не существует такой вещи, как «никаких специальных разрешений». Все требует определенного уровня разрешения для доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...