Получение только списка имен файлов FTP, без дополнительных сведений

Я пытаюсь загрузить содержимое папки FTP в локальную папку, используя этот пример в StackOverflow:
Загрузка списка файлов с ftp в локальную папку с помощью c#?

Код, который у меня есть на данный момент:

public void DownloadFilesFromFTP(string localFilesPath, string remoteFTPPath)
{
    remoteFTPPath = "ftp://" + Hostname + remoteFTPPath;
    var request = (FtpWebRequest)WebRequest.Create(remoteFTPPath);

    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    request.Credentials = new NetworkCredential(Username, Password);
    request.Proxy = null;

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);
    List<string> directories = new List<string>();

    string line = reader.ReadLine();

    while (!string.IsNullOrEmpty(line))
    {
        directories.Add(line);
        line = reader.ReadLine();
    }
    reader.Close();

    using (WebClient ftpClient = new WebClient())
    {
        ftpClient.Credentials = new System.Net.NetworkCredential(Username, Password);

        for (int i = 0; i <= directories.Count - 1; i++)
        {
            if (directories[i].Contains("."))
            {

                string path = remoteFTPPath + @"/" + directories[i].ToString();
                string trnsfrpth = localFilesPath + @"\" + directories[i].ToString();

                ftpClient.DownloadFile(path, trnsfrpth);
            }
        }
    }

    response.Close();
}

Я получаю исключение, связанное с неподдерживаемым путем, и когда я проверяю значения моих переменных path и trnsfrpth, они, кажется, включают информацию Apache.

путь: ftp://hostname/data/resourceOrders/ -rw-r--r-- 1 apache
apache 367 16 июля 14:07 resource-orders-1437019656813-893.json

И

trnsfrpth: V:\code.runner\local\orders-rw-r--r-- 1 apache apache
367 16 июля 14:07 resource-orders-1437019656813-893.json

Как я могу захватить только имя файла, resource-orders-1437019656813-893.json без хакерского (например, rightof()) подхода?


person Michael A    schedule 20.07.2015    source источник


Ответы (2)


Чтобы получить только список имен файлов без дополнительных сведений, используйте WebRequestMethods.Ftp.ListDirectory (команда FTP NLST) вместо WebRequestMethods.Ftp.ListDirectoryDetails (FTP-команда LIST).

person Martin Prikryl    schedule 20.07.2015
comment
Не могу поверить, что это так просто. Большое тебе спасибо! - person Michael A; 20.07.2015

Вот функция, которую я использую:

public class FileName : IComparable<FileName>
{
    public string fName { get; set; }
    public int CompareTo(FileName other)
    {
        return fName.CompareTo(other.fName);
    }
}

public static void getFileList(string sourceURI, string sourceUser, string sourcePass, List<FileName> sourceFileList)
{
    string line = "";
    FtpWebRequest sourceRequest;
    sourceRequest = (FtpWebRequest)WebRequest.Create(sourceURI);
    sourceRequest.Credentials = new NetworkCredential(sourceUser, sourcePass);
    sourceRequest.Method = WebRequestMethods.Ftp.ListDirectory;
    sourceRequest.UseBinary = true;
    sourceRequest.KeepAlive = false;
    sourceRequest.Timeout = -1;
    sourceRequest.UsePassive = true;
    FtpWebResponse sourceRespone = (FtpWebResponse)sourceRequest.GetResponse();
    //Creates a list(fileList) of the file names
    using (Stream responseStream = sourceRespone.GetResponseStream())
    {
        using (StreamReader reader = new StreamReader(responseStream))
        {
            line = reader.ReadLine();
            while (line != null)
            {
                var fileName = new FileName
                        {
                            fName = line
                        };
                        sourceFileList.Add(fileName);
                line = reader.ReadLine();
            }
        }
    }   
}

Установите свой sourceURI, пользователя и пароль в main() и объявите список файлов, например:

List<FileName> sourceFileList = new List<FileName>();
string sourceURI = "ftp://www.sourceftp.com/";
string sourceUser = "testUser";
string sourcePass = "testPass";

Это даст вам легко повторяемый список имен файлов (sourceFileList[i].fName) для прохождения! Их можно сортировать с помощью .Sort(), а также выполнять двоичный поиск.

person John Boling    schedule 20.07.2015