C# Renci.SshNet: 无法上传 SFTP 根目录之外的文件 - 当前工作目录中的斜线被转换为反斜线

C# Renci.SshNet: Unable to upload files outside of SFTP root - slashes in current working directory are converted to backslahes

我正在使用以下方法将文本文件上传到 SFTP 服务器。当我将目标路径设置为根 ("/") 时,文件上传没有问题。当我尝试将文件上传到根目录("/upld/")的子目录时,没有文件上传,但也没有错误。

有趣的是,在调用 client.ChangeDirectory 之后,客户端上的 WorkingDirectory 属性 会正确更新,除了它是 "\upld"。但是上传就是不行。

public void UploadSFTPFile(string sourcefile, string destinationpath)
{
    using (SftpClient client = new SftpClient(this.host, this.port, this.username, this.password))
    {
        client.Connect();
        using (FileStream fs = new FileStream(sourcefile, FileMode.Open))
        {
            client.UploadFile(fs, destinationpath + Path.GetFileName(sourcefile));
        }
    }
}

public void Caller()
{
    string localpath = "./foo.txt";
    string destinationpath = "/upld/"; // this does not upload any files
    //string destinationpath = "/"; // this uploads the file to root
    UploadSFTPFile(localpath, destinationpath);
}

你的代码对我来说工作得很好。

问题可能出在您所观察到的情况:您的 SFTP 服务器(不是 C#)将斜杠转换为反斜杠,这混淆了 SSH.NET 库,当组装完整路径时已上传文件。

注意 SFTP 协议(与 FTP 相反)没有工作目录的概念。工作目录只是在客户端由 SSH.NET.

模拟

很可能您可以通过在 UploadFile 调用中使用绝对路径而不是使用相对路径来解决您的问题:

public void UploadSFTPFile(string sourcefile, string destinationpath)
{
    using (SftpClient client = new SftpClient(host, port, username, password))
    {
        client.Connect();
        using (FileStream fs = new FileStream(sourcefile, FileMode.Open))
        {
            client.UploadFile(fs, destinationpath + Path.GetFileName(sourcefile));
        }
    }
}