C # Renci.SshNet: невозможно загрузить файлы за пределы корня SFTP — косые черты в текущем рабочем каталоге преобразуются в обратную косую черту

Я использую следующий метод для загрузки текстового файла на 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);
}

person Evan French    schedule 11.07.2017    source источник
comment
Попробуйте использовать / в качестве разделителя удаленных каталогов вместо \. SFTP указывает / независимо от операционной системы сервера.   -  person Kenster    schedule 12.07.2017
comment
Я пытался использовать / в качестве разделителя, но это не имело никакого значения. Когда я смотрю на значения в отладчике, С# автоматически преобразует \\ в /.   -  person Evan French    schedule 12.07.2017
comment
C# автоматически преобразует \\ в / - это бессмысленно. Покажите нам свой обновленный код.   -  person Martin Prikryl    schedule 12.07.2017
comment
Под C# автоматически преобразует \\ в / я имел в виду, что вызов client.ChangeDirectory(//upld//); изменяет client.WorkingDirectory на \upld. Я обновил код, чтобы использовать \   -  person Evan French    schedule 12.07.2017


Ответы (1)


Ваш код отлично работает для меня.

Проблема, вероятно, в том, что вы заметили: ваш 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));
        }
    }
}
person Martin Prikryl    schedule 12.07.2017
comment
Я обновил свой код, чтобы он соответствовал вашему предложению, но все еще сталкиваюсь с тем же поведением: файл не загружается без сообщения об ошибке. Любые другие идеи? - person Evan French; 12.07.2017
comment
Вы пробовали обратную косую черту? Какой у вас SFTP-сервер, кстати? - person Martin Prikryl; 12.07.2017
comment
Я пробовал обратную косую черту, но это не изменило поведение. SFTP-сервер принадлежит клиенту и размещен в edicomm. - person Evan French; 12.07.2017
comment
Можете ли вы загрузить файл во вложенную папку с помощью любого клиентского приложения SFTP? - person Martin Prikryl; 12.07.2017
comment
Я могу загрузить в подпапку с помощью FileZilla. - person Evan French; 12.07.2017
comment
Покажите нам файл журнала. - person Martin Prikryl; 12.07.2017
comment
Я думаю, что я, возможно, понял проблему. Я попытался отправить сообщение в другую подпапку, и это сработало. Также тестовый файл, который я загрузил через FileZilla, исчезает из папки upld. Я считаю, что произошло то, что клиент каждую секунду проверяет наличие новых файлов и очищает их, прежде чем я смогу проверить. Насколько я вижу, код работает отлично. Спасибо за помощь. - person Evan French; 12.07.2017