簡體   English   中英

SSH.NET庫對文件名進行編碼

[英]SSH.NET library encode the file name

我必須使用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的屬性具有正確的值...未編碼

謝謝

您正在將自己創建的流( new FileStream )傳遞到SSH.NET。 該庫甚至不知道它是要寫入的文件,也不知道其名稱。 因此,不是URL編碼文件名的庫。 它必須已經在fullPath變量中進行了URL編碼。

返回URL編碼路徑的是Uri.AbsolutePathUri.Segments 這就是System.Uri類的工作方式。 我假設您使用構造函數重載Uri(string uriString)

使用靜態方法Uri.UnescapeDataString可以反轉由Uri構造函數完成的編碼。

注意廢棄的構造函數重載Uri(string uriString, bool dontEscape)

看起來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的文件”,盡管自從通過流創建文件以來一直如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM