我必须使用SSH.NET库下载文件。下载文件后,我必须删除远程文件。
一切正常但文件名已编码。我的意思是,例如,如果我有一个名为New file
的文件,我下载/上传一个名为New%20file
的文件。现在,如果我下载/上传新文件,我会获得New%25%20file
并再次New%252520file
...等等......
这是非常有问题的。下载后如何避免更改文件名?
这里是我用来下载的代码:
string fileName = base.Uri.GetFileName();
string fullPath = Path.Combine(pathFolder, fileName);
using (SftpClient client = new SftpClient(
new PasswordConnectionInfo(
base.Uri.Host, SftpFlowGateway.CONST_PORT_NUMBER,
base.Credential.UserName,
base.Credential.Password))
)
{
client.Connect();
using (FileStream fileStreamToDownload = new FileStream(fullPath, FileMode.Create))
{
client.DownloadFile(base.Uri.LocalPath, fileStreamToDownload);
}
client.Disconnect();
}
编辑:
base.Uri
的定义如下:
private Uri _uri;
public Uri Uri
{
get { return _uri; }
protected set { _uri = value; }
}
GetFileName方法是:
public static string GetFileName(this Uri path)
{
return path.Segments.Last();
}
当我调试时,我可以看到类Uri的属性具有正确的值...它没有编码
谢谢
答案 0 :(得分:3)
您正在将自己创建的流(new FileStream
)传递给SSH.NET。图书馆甚至不知道它是写入的文件,也不知道它的名字。因此,对文件名进行URL编码的不是库。它必须已在fullPath
变量中进行URL编码。
返回URL编码路径的是Uri.AbsolutePath
和Uri.Segments
。这就是System.Uri
类的工作原理。我假设你使用构造函数overload Uri(string uriString)
。
使用静态方法Uri.UnescapeDataString
来反转Uri
constructor完成的编码。
请注意过时的构造函数重载Uri(string uriString, bool dontEscape)
。
答案 1 :(得分:2)
看起来SSH.Net库只是URL对文件名进行编码。
我想您可以在使用System.Web.UrlDecode方法下载文件后重命名该文件吗?
或者上传时UrlEncode文件名。
很遗憾,我自己还没有使用过图书馆,但是如果下载或上传或两者都发生了名称更改,您可以帮助我们进一步了解。
编辑: 正如马丁所说,它不是图书馆进行任何编码。
我自己就试过了。
string fileName = "file with spaces.txt";
using (Stream outputFile = File.OpenWrite(localDir + "\\" + fileName))
{
sftpClient.DownloadFile(fileName, outputFile);
}
创建的文件也被命名为"文件包含spaces.txt"尽管如此,因为它是通过流创建的。