写入安装路径时出现System.UnauthorizedAccessException

时间:2018-06-28 14:00:35

标签: c# .net uwp

我正在尝试从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)))

我肯定在这里遗漏了一些明显的东西,但是值得注意的是,我还尝试了写入特殊文件夹(例如桌面),用户的Document文件夹以及直接写入C:/驱动器的操作,所有这些都具有相同的例外。我还以管理员权限运行,并且在文件夹中设置了正确的权限。

3 个答案:

答案 0 :(得分:1)

事实证明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();

答案 1 :(得分:1)

您在这里遇到多个问题。您回答的父文件夹(“ ..”)引用是一个阻止程序,但这并未解决InstalledLocation是只读的更深层次的问题。

UWP应用没有直接访问大多数文件系统位置的权限。默认情况下,他们可以读取和写入其ApplicationData目录,并且可以从InstalledLocation读取(但不能写入)。您在台式机,文档和C:\上看到的所有故障都是预期的。

其他位置(包括桌面,文档和C :)可以由用户明确或通过应用程序声明的功能授予访问权限。可以通过文件代理通过StorageFile对象访问它们。

请参阅UWP File access permissions文档:

  

该应用程序的安装目录是只读位置。你无法获得   通过文件选择器访问安装目录。

从长远来看,您可能希望将文件下载到其他位置:可能会下载到ApplicationData文件夹之一中。这些文件夹是唯一对UWP应用没有特殊权限要求的文件夹。

那为什么现在适合您?

您遇到了一个调试怪癖,其中您的应用程序尚未完全安装,但从VS项目目录暂存。这样,应用程序就可以写入暂存的安装目录,但是一旦将其正确部署到Program Files \ WindowsApps中,则写入InstalledLocation的操作将失败。

答案 2 :(得分:0)

尝试使用Path.GetTempPath();。您应该在那里获得许可。

当它说您没有权限时,您没有权限。 8-)

此外,没有“没有特殊权限”之类的东西。一切都需要某种级别的访问权限。