系统.未授权访问写入安装路径时的异常



我正在尝试从SFTP服务器下载多个文件并将它们保存到安装路径(或者实际上,目前的任何路径只是为了让它工作(。但是,无论我尝试在哪里保存文件,我都会收到未经授权的访问异常。

据了解,将文件保存到安装目录不需要特殊权限(因此我选择此文件夹的原因(。

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:/驱动器,所有这些都有相同的例外。我还使用管理员权限运行,并且在文件夹中设置了正确的权限。

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

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

UWP 应用无法直接访问大多数文件系统位置。默认情况下,他们可以读取和写入其应用程序数据目录,并且可以读取(但不能写入(已安装位置。您在桌面、文档和 C:\ 中看到的故障都是意料之中的。

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

请参阅 UWP 文件访问权限文档:

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

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

那么为什么现在这对你有用呢?

你遇到了调试怪癖,其中应用未完全安装,而是从 VS 项目目录暂存。这允许应用写入暂存安装目录,但是一旦它正确部署到程序文件\WindowsApps 中,写入安装位置将失败。

Try Path.GetTempPath((;.你应该在那里有权限。

当它说你没有权限时,你没有。 8-(

此外,没有"没有特殊权限"这样的东西。一切都需要一定程度的访问权限。

最新更新