我正在尝试从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:/驱动器的操作,所有这些都具有相同的例外。我还以管理员权限运行,并且在文件夹中设置了正确的权限。
答案 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-)
此外,没有“没有特殊权限”之类的东西。一切都需要某种级别的访问权限。