Загрузить все файлы, соответствующие шаблону, в SFTP

Я использую Tamir SharpSSH для передачи файлов с удаленного на локальный и наоборот без проблем.

Но при попытке загрузить несколько файлов XML через SFTP я получаю сообщение об ошибке:

Недопустимые символы в пути.

Если я попытаюсь загрузить, используя точное имя файла, он передаст файл без каких-либо проблем.

Каждый раз, когда я пытаюсь загрузить два файла XML:

KDO_E2D_A21_AA769_20170124_143123.xml
KDO_E2D_A21_AA776_20170130_143010.xml
string ftpURL = "11.11.11.1";
string userName = "Aaaaaa"; //User Name of the SFTP server
string password = "hah4444"; //Password of the SFTP server
int port = 22; //Port No of the SFTP server (if any)

//The directory in SFTP server where the files will be uploaded
string ftpDirectory = "/home/A21sftp/kadoe/";

//Local directory from where the files will be uploaded 
string localDirectory = "E:\\Zatpark\\*.xml"; 

Sftp Connection = new Sftp(ftpURL, userName, password);
Connection.Connect(port);
Connection.Put(localDirectory, ftpDirectory); 
Connection.Close();

person Kiran V    schedule 01.02.2017    source источник
comment
E:\Zatpark\*.xml мне не кажется правильным путем. Ваша реализация Sftp явно разрешает такую ​​передачу? (Я бы удивился, если бы это было так). Вероятно, это является причиной ошибки недопустимые символы в пути, поскольку * не является допустимым символом пути. С другой стороны: вы действительно должны выбрать одно соглашение об именах, даже в этом коротком коде вы используете три разных.   -  person Manfred Radlwimmer    schedule 01.02.2017
comment
Если вы хотите использовать подстановочные знаки в пути и использовать другую стороннюю библиотеку, вы можете проверить этот componentpro.com/sftp.net, и вот пример: componentpro.com/doc/sftp/upload-files.htm   -  person faheem khan    schedule 26.04.2017


Ответы (1)


Не используйте Tamir.SharpSSH, это мертвый проект. Используйте некоторую современную реализацию SSH/SFTP.


Если вы переключитесь на такую ​​библиотеку, как SSH.NET, которая не поддерживает подстановочные знаки, вы должны использовать Directory.GetFiles метод для поиска файлов для загрузки:

SftpClient client = new SftpClient("example.com", "username", "password");
client.Connect();

string localDirectory = @"E:\Zatpark upload";
string localPattern = "*.xml";
string ftpDirectory = "/dv/inbound/";
string[] files = Directory.GetFiles(localDirectory, localPattern);
foreach (string file in files)
{
    using (Stream inputStream = new FileStream(file, FileMode.Open))
    {
        client.UploadFile(inputStream, ftpDirectory + Path.GetFileName(file));
    }
}

Или используйте библиотеку, которая поддерживает подстановочные знаки.

Например, с сборкой WinSCP .NET (хотя это не чистая сборка .NET), вы сможет сделать:

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = "example.com",
    UserName = "username",
    Password = "password",
    SshHostKeyFingerprint = "ssh-dss ...",
};

using (Session session = new Session())
{
    session.Open(sessionOptions);
    string ftpDirectory = "/dv/inbound/"; 
    string localDirectory = @"E:\Zatpark upload\*.xml";
    session.PutFiles(localDirectory, ftpDirectory).Check();
}

У вас может быть шаблон кода, созданный в графическом интерфейсе WinSCP.

(я автор WinSCP)


Чтобы объяснить, почему ваш код не работает: Проверьте метод ChannelSftp.glob_local. Его реализация странная, если не сказать сломанная. В основном он поддерживает только маски, полностью состоящие из * и ?.

person Martin Prikryl    schedule 07.02.2017