C#Renci.SshNet:无法上传SFTP根目录以外的文件 - 当前工作目录中的斜杠转换为后退

时间:2017-07-11 19:56:06

标签: c# .net sftp ssh.net

我使用以下方法将文本文件上传到SFTP服务器。当我将目标路径设置为root("/")时,文件上传没有问题。当我尝试将文件上传到根目录("/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);
}

1 个答案:

答案 0 :(得分:0)

您的代码对我来说很合适。

问题可能是,您所观察到的:您的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));
        }
    }
}