SSH.NET库编码文件名

时间:2014-11-17 09:38:27

标签: c# encoding ssh sftp ssh.net

我必须使用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的属性具有正确的值...它没有编码

谢谢

2 个答案:

答案 0 :(得分:3)

您正在将自己创建的流(new FileStream)传递给SSH.NET。图书馆甚至不知道它是写入的文件,也不知道它的名字。因此,对文件名进行URL编码的不是库。它必须已在fullPath变量中进行URL编码。

返回URL编码路径的是Uri.AbsolutePathUri.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"尽管如此,因为它是通过流创建的。