Загрузите последний файл с FTP-сервера

Я должен загрузить последний файл с FTP-сервера. Я знаю, как загрузить последнюю версию файла с моего компьютера, но я не знаю, как загрузить с FTP-сервера.

Как я могу загрузить последний файл с FTP-сервера?

Это моя программа для загрузки последней версии файла с моего компьютера.

public Form1()
    {
        InitializeComponent();

        string startFolder = @"C:\Users\user3\Desktop\Documentos XML";

        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);

        IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

        IEnumerable<System.IO.FileInfo> fileQuerry =
            from file in fileList
            where file.Extension == ".txt"
            orderby file.CreationTimeUtc
            select file;

        foreach (System.IO.FileInfo fi in fileQuerry)
            {
                var newestFile =
                (from file in fileQuerry
                 orderby file.CreationTimeUtc
                 select new { file.FullName, file.Name })
                 .First();
                textBox2.Text = newestFile.FullName;
            }
    }

Хорошо, с этим кодом я знаю дату последнего файла, но как я знаю имя этого файла????????

2 ответа

Решение

Вы должны получить временные метки удаленных файлов, чтобы выбрать самую последнюю.

К сожалению, нет действительно надежного и эффективного способа получения меток времени изменения всех файлов в каталоге с использованием функций, предлагаемых.NET Framework, так как он не поддерживает FTP MLSD команда. MLSD Команда предоставляет список удаленных каталогов в стандартизированном машиночитаемом формате. Команда и формат стандартизированы RFC 3659.

Вы можете использовать альтернативы, которые поддерживаются.NET Framework:

  • ListDirectoryDetails метод (FTP LIST команда), чтобы получить сведения обо всех файлах в каталоге, а затем вы имеете дело с конкретным форматом подробностей FTP-сервера

    Формат DOS/Windows: класс C# для анализа WebRequestMethods.Ftp.ListDirectoryDetails FTP-ответ
    *nix формат: анализ строки FtpWebRequest ListDirectoryDetails

  • GetDateTimestamp метод (FTP MDTM команда) для индивидуального получения меток времени для каждого файла. Преимущество состоит в том, что ответ стандартизирован RFC 3659 для YYYYMMDDHHMMSS[.sss], Недостатком является то, что вы должны отправлять отдельный запрос для каждого файла, что может быть довольно неэффективным. Этот метод использует LastModified свойство, которое вы упоминаете:

    const string uri = "ftp://example.com/remote/path/file.txt";
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Console.WriteLine("{0} {1}", uri, response.LastModified);
    

В качестве альтернативы вы можете использовать стороннюю реализацию FTP-клиента, которая поддерживает современные MLSD команда.

Например, сборка WinSCP .NET поддерживает это.

Есть даже пример для вашей конкретной задачи: загрузка самого последнего файла.
Пример для PowerShell и SFTP, но легко переводит в C# и FTP:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "username",
    Password = "password",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Get list of files in the directory
    string remotePath = "/remote/path/";
    RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath);

    // Select the most recent file
    RemoteFileInfo latest =
        directoryInfo.Files
            .OrderByDescending(file => file.LastWriteTime)
            .First();

    // Download the selected file
    string localPath = @"C:\local\path\";
    string sourcePath = RemotePath.EscapeFileMask(remotePath + latest.Name);
    session.GetFiles(sourcePath, localPath).Check();
}

(Я автор WinSCP)

Класс FtpWebRequest определен в пространстве имен System.Net. Это означает, что вам нужно использовать это пространство имен в верхней части вашей программы, чтобы использовать класс FtpWebRequest.

      private List ListFiles()  
{  
try  
{  
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.server.com/");  
     request.Method = WebRequestMethods.Ftp.ListDirectory;  
     request.Credentials = new NetworkCredential("username", "password");  
     FtpWebResponse response = (FtpWebResponse)request.GetResponse();  
     Stream responseStream = response.GetResponseStream();  
     StreamReader reader = new StreamReader(responseStream);  
     string names = reader.ReadToEnd();  

     reader.Close();  
     response.Close();  

     return names.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();  
}  
catch (Exception)  
{  
    throw;  
}  

}

В предыдущем коде мы создаем запрос к FTP-серверу с помощью класса FtpWebRequest и устанавливаем RequestMethod запроса на WebRequestMethods.Ftp.ListDirectory. В следующей строке мы определяем учетные данные, которые будут использоваться на сервере. Затем мы запускаем запрос и получаем ответ в объекте FtpWebResponse. RequestMethod «ListDirectory» возвращает все данные с сервера в строковом формате. Наконец, мы анализируем поток ответов и разделяем возвращенные данные, чтобы получить список всех файлов и папок, имеющихся на сервере.

Другие вопросы по тегам