1

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

谢谢

4

2 回答 2

4

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

它是返回 URL 编码路径的Uri.AbsolutePathand 。Uri.Segments这就是System.Uri课堂的运作方式。我假设您使用构造函数重载Uri(string uriString)

使用静态方法反转由构造函数Uri.UnescapeDataString完成的编码。Uri

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

于 2014-11-17T17:33:17.713 回答
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”,但无论如何都是这样,因为它是通过流创建的。

于 2014-11-17T11:52:52.897 回答