C# 将所有匹配通配符的文件上载到SFTP

C# 将所有匹配通配符的文件上载到SFTP,c#,.net,sftp,sharpssh,C#,.net,Sftp,Sharpssh,我使用Tamir SharpSSH将文件从远程传输到本地,反之亦然,没有任何问题 但是,当尝试通过SFTP上载多个XML文件时,我收到一个错误: 路径中存在非法字符 如果我尝试使用确切的文件名上传,它会毫无问题地传输文件 每次我尝试上载两个XML文件时: KDO_E2D_A21_AA769_20170124_143123.xml KDO_E2D_A21_AA776_20170130_143010.xml 不要使用Tamir.SharpSSH,它是一个死项目。使用一些 如果切换到不支持通配符的

我使用Tamir SharpSSH将文件从远程传输到本地,反之亦然,没有任何问题

但是,当尝试通过SFTP上载多个XML文件时,我收到一个错误:

路径中存在非法字符

如果我尝试使用确切的文件名上传,它会毫无问题地传输文件

每次我尝试上载两个XML文件时:

KDO_E2D_A21_AA769_20170124_143123.xml
KDO_E2D_A21_AA776_20170130_143010.xml

不要使用Tamir.SharpSSH,它是一个死项目。使用一些


如果切换到不支持通配符的库,则必须使用查找要上载的文件:

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));
    }
}

或者使用支持通配符的库

例如,对于(虽然不是纯.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的作者)



要解释代码不起作用的原因,请检查
ChannelSftp.glob\u local
方法。它的实现是奇怪的,如果不是被破坏的话。它基本上只支持完全由
*
组成的掩码。

不要使用Tamir.SharpSSH,它是一个死项目。使用一些


如果切换到不支持通配符的库,则必须使用查找要上载的文件:

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));
    }
}

或者使用支持通配符的库

例如,对于(虽然不是纯.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的作者)



要解释代码不起作用的原因,请检查
ChannelSftp.glob\u local
方法。它的实现是奇怪的,如果不是被破坏的话。它基本上只支持完全由
*
组成的掩码。

E:\Zatpark\*.xml
在我看来不是有效的路径。您的Sftp实现是否明确允许这样的传输?(如果是的话,我会感到惊讶)。这可能是“路径中的非法字符”错误的原因,因为
*
不是有效的路径字符。另一方面,nide:即使在这段简短的代码中,您使用的是三种不同的命名约定,您也应该决定使用一种命名约定。如果您希望在路径中使用通配符掩码,并且使用另一个第三方库可能是一种选择,那么您可能需要签出它,下面是一个例子:
E:\Zatpark\*.xml
对我来说似乎不是一条有效的路径。您的Sftp实现是否明确允许这样的传输?(如果是的话,我会感到惊讶)。这可能是“路径中的非法字符”错误的原因,因为
*
不是有效的路径字符。另一方面,nide:即使在这段简短的代码中,您使用的是三种不同的命名约定,您也应该决定使用一种命名约定。如果您希望在路径中使用通配符掩码,并且使用另一个第三方库可能是一种选择,那么您可能需要签出该约定,下面是一个示例: