【问题标题】:SSH.NET library encode the file nameSSH.NET 库对文件名进行编码
【发布时间】:2015-01-14 04:22:48
【问题描述】:

我必须使用 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的属性值是正确的...不是编码的

谢谢

【问题讨论】:

    标签: c# encoding ssh sftp ssh.net


    【解决方案1】:

    看起来 SSH.Net 库只是对文件名进行 URL 编码。

    我想您可以在使用 System.Web.UrlDecode 方法下载文件后重命名文件?

    或上传时对文件名进行 UrlEncode。

    很遗憾,我自己并没有使用过该库,但您可以通过让我们知道名称更改发生在下载或上传或两者兼而有之来进一步提供帮助。

    编辑: 正如马丁所说,它不是库做任何编码。

    我自己也试过了。

    string fileName = "file with spaces.txt";
    using (Stream outputFile = File.OpenWrite(localDir + "\\" + fileName))
    {
        sftpClient.DownloadFile(fileName, outputFile);
    }
    

    创建的文件也被命名为“带空格的文件.txt”,但无论如何都是这样,因为它是通过流创建的。

    【讨论】:

    • 您好,名称更改发生在下载和上传时。我想我可以在远程文件上使用 UrlEncode/UrlDecode.. 但是,在下载时问题出在本地..
    【解决方案2】:

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

    返回 URL 编码路径的是 Uri.AbsolutePathUri.Segments。这就是System.Uri 类的工作原理。我假设你使用构造函数重载Uri(string uriString)

    使用静态方法Uri.UnescapeDataString 反转Uri constructor 完成的编码。

    注意已过时的构造函数重载Uri(string uriString, bool dontEscape)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2013-06-15
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多