当前位置: 首页 > 知识库问答 >
问题:

在SSIS/C中的两个远程FTP和SFTP服务器之间传输文件,然后将源文件归档到另一个目录

淳于健
2023-03-14

我已经为此挣扎了一段时间,但我真的不知道如何使用SSIS解决这种情况(我正在考虑用C#创建一个脚本任务)

这是我的问题:每天都会创建一个文件并将其存储在特定服务器的某个目录中(我可以通过使用客户端-服务器应用程序(例如FileZilla或任何其他程序)中的FTP协议来访问它)。我想将该文件传输到使用SFTP协议的不同服务器。然后,一旦它成功放置在该服务器中,将原始文件移动到源FTP服务器上的不同文件夹。

看看这个例子:

我需要将文件myfiletest.csv传输到不同的SFTP服务器。路径是:秒服务器/位置这里

最后,文件传输后,我想将源文件移动到文件夹Process

一直试图将文件从第一台服务器复制并移动到第二台服务器,但没有成功,我现在有点迷路了。

能帮我解决吗?

这就是我尝试从FTP服务器读取文件的方式(我无法正确读取它,甚至无法将其保存在本地环境中)。

 public void Main()
 {
    var directory =
        new DirectoryInfo(Dts.Variables["User::FolderPath"].Value.ToString());

    FileInfo[] files = directory.GetFiles();
    DateTime lastModified = DateTime.MinValue;

    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > lastModified)
        {
            lastModified = file.LastWriteTime;
            Dts.Variables["User::FileName"].Value = file.ToString();
        }
    }

     MessageBox.Show(Dts.Variables["User::FileName"].Value.ToString());


     Dts.TaskResult = (int)ScriptResults.Success;
 }

共有1个答案

季骏祥
2023-03-14

您的代码不会访问任何服务器。它不使用FTP或SFTP。它适用于本地文件。

无论如何,如果FTP和SFTP是您唯一可用的接口,则无法将文件直接从FTP复制到SFTP服务器。

您必须从FTP服务器下载文件,然后将其上载到SFTP服务器。

>

  • 要在FTP服务器上查找最新文件,请从FTP服务器下载最新文件

    有关FTP下载,请参阅在C#/中向/从FTP服务器上传和下载文件。NET

    有关SFTP上载,请参阅C#SFTP上载文件

    要移动文件,请参阅如何使用FTP在目录之间移动文件?

    您可以将文件从下载直接流式传输到上传,以避免将文件存储到临时本地文件中。

    如果您想使用内置的。NET FTP实现(WebClient/FtpWebRequest)和本机。NET SFTP库(如SSHH. NET),您可以这样做:

    var ftpClient = new WebClient();
    ftpClient.Credentials = new NetworkCredential("ftpuser", "ftppass");
    var ftpUrl = "ftp://ftp.example.com/ftp/path/file.csv";
    using (var ftpStream = ftpClient.OpenRead(ftpUrl))
    using (var sftpClient = new SftpClient("sftp.example.com", "sftpuser", "sftppass"))
    {
        sftpClient.UploadFile(ftpStream, "/sftp/path/file.csv");
    }
    

    要移动处理过的文件:

    FtpWebRequest ftpRequest = new FtpWebRequest(ftpUrl);
    ftpRequest.Method = WebRequestMethods.Ftp.Rename;
    ftpRequest.RenameTo = "/ftp/path/processed/file.csv";
    ftpRequest.GetResponse(); 
    

    如果有这两个SFTP服务器,使用我的WinSCP.NET程序集会更容易一些。虽然不是本机的.NET库,但它可以从SSIS中使用。使用WinSCP时,代码如下:

    // Setup session options
    SessionOptions sftpSessionOptions1 = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = "sftp1.example.com",
        UserName = "username1",
        Password = "password",
    };
    
    SessionOptions sftpSessionOptions2 = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = "sftp2.example.com",
        UserName = "username2",
        Password = "password",
        SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
    };
    
    using (Session sftpSession1 = new Session())
    using (Session sftpSession2 = new Session())
    {
        // Connect to SFTP 1
        ftpSession1.Open(sftpSessionOptions1);
    
        // Get list of files in the FTP directory
        string sftpRemoteDir1 = "/ftp/remote/path";
        RemoteDirectoryInfo dirInfo = sftpSession1.ListDirectory(sftpRemoteDir1);
    
        // Select the most recent file
        RemoteFileInfo latest =
            dirInfo.Files
                .Where(file => !file.IsDirectory)
                .OrderByDescending(file => file.LastWriteTime)
                .First();
    
        // Connect to SFTP
        sftpSession2.Open(sftpSessionOptions2);
    
        string sftpRemoteDir2 = "/sftp/remote/path";
        string sftpRemotePath2 = RemotePath.Combine(sftpRemoteDir2, latest.Name);
    
        // Transfer from SFTP 1 to SFTP 2
        using (Stream downloadStream = sftpSession1.GetFile(latest.FullName))
        {
            sftpSession2.PutFile(downloadStream, sftpRemotePath2);
        }
    
        // Move the source file to the "processed" folder
        string processedDir = "/sftp/remote/path/processed";
        string processedPath = RemotePath.Combine(processedDir, latest.Name);
        ftpSession.MoveFile(latest.FullName, processedPath);
    }
    

    未经测试。需要WinSCP 5.19或更新版本。

  •  类似资料:
    • 问题内容: 我一直在尝试使用以下方法将远程服务器中的一些选定文件(在执行几次检查后)复制到同一台远程服务器中: 我什至尝试使用该方法将那些选定的文件复制到本地计算机。 有人可以帮忙吗? 问题答案: 核心SFTP协议不支持复制远程文件。 该协议有扩展草案,但只有少数SFTP服务器(例如ProFTPD / mod_sftp 和Bitvise SFTP服务器)支持该协议。 JSch库也不支持该扩展。 备

    • 我需要登录到unix服务器,执行switch user,执行一些命令,然后将这些命令创建的文件scp到另一台服务器。我能够连接到服务器,执行sudo登录和执行命令,但我无法将文件直接scp到另一个远程服务器。 我用的是Jsch jar。下面是我的代码。 public void executeChannel(会话会话、字符串命令、字符串pwd、列表文件)引发异常{ command=sudo su-p

    • 有一个用例,我必须: 在我的应用程序中,在应用程序服务器上生成一个文件。让我们把这称为一台机器。(这是我的Java代码运行的地方,用来生成文件) 从应用程序本身,我希望使用SFTP将这个文件传输到一个固定路径(比如)的白名单服务器B 第1点和第2点是直截了当的。 现在有一个外部服务器C(我提供了它的凭据) 现在,应用程序正在服务器A上运行。 文件现在位于服务器B中的== 如何实现这种多次跳转的SF

    • 了解如何使用“文件”面板在 Dreamweaver 中管理文件和文件夹、在本地和远程站点之间传输和同步它们。此外,还可了解在 Dreamweaver 中自动恢复功能如何运行。 使用 Dreamweaver 中的“文件”面板,您可以访问和管理与您的站点关联的文件。在“文件”面板中,您可以将视图切换为“FTP 视图”或“Git 视图”,进而使用 FTP 服务器或 Git 存储库来管理文件。 要打开“文

    • 本文向大家介绍文件传输协议(FTP)和安全文件传输协议(SFTP)之间的区别,包括了文件传输协议(FTP)和安全文件传输协议(SFTP)之间的区别的使用技巧和注意事项,需要的朋友参考一下 FTP和SFTP是文件传输协议,用于将文件从一个系统传输到另一个系统。FTP不使用任何安全通道来传输文件,而SFTP使用SSH协议来建立控制连接,并且比FTP高度安全。 以下是FTP和SFTP之间的一些重要区别。

    • 问题内容: 我需要使用JSch库对文件传输进行编程。我有一个包含两个文件夹的简单目录 在SFTP_1文件夹中,我有一个位图图像。该SFTP_2文件夹只是一个空文件夹。我的目标是使用SFTP将图像从SFTP_1传输到SFTP_2。 到目前为止,这是我的代码: 我想做的只是将文件从计算机中的一个目录传输到另一个目录。任何提示表示赞赏,谢谢! 问题答案: 请注意,要在两个文件夹之间进行复制,不需要使用S