Как просмотреть содержимое каталога с помощью FTP на С#?

Как составить список содержимого каталога с помощью FTP в C#?

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

Как я могу это сделать?

public class WebRequestGetExample
{
    public static void Main ()
    {
        // Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/");
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

        // This example assumes the FTP site uses anonymous logon.
        request.Credentials = new NetworkCredential ("anonymous","[email protected]");

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        Console.WriteLine(reader.ReadToEnd());

        Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription);

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

MSDN


person Swapnil Gupta    schedule 21.07.2010    source источник
comment
Я бы использовал NameSearchCondition(., SearchConditionFileTypes.Directory) в качестве метода ListDirectory параметра условия поиска для конечный ftp. См. этот пример: componentpro. com/doc/ftp/   -  person Peter    schedule 23.12.2014


Ответы (7)


Попробуй это:

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Credentials =new NetworkCredential("anonymous","[email protected]");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());

List<string> directories = new List<string>();

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

streamReader.Close();

Он дал мне список каталогов... все перечисленные в списке строк каталогов... скажите мне, это то, что вам нужно

person mint    schedule 21.07.2010
comment
Привет, Ваш код возвращает результат в формате XML. Мне нужны только удаленные системные каталоги, потому что мне нужно связать имена этих каталогов с древовидной структурой. Получение XML не будет работать для меня. - person Swapnil Gupta; 21.07.2010
comment
@swapnil Мой приведенный выше код (я отредактировал) работал у вас? просто любопытно - person mint; 21.07.2010
comment
Он возвращает мне ‹A HREF=Swapnil/›‹IMG border=0 SRC=proxy-1.lge.net:8080/squid-internal-static/icons/ ALT=[DIR] ›‹/A› ‹A HREF=Swapnil/›Swapnil‹/A ›. . . . . . . . . . . . . 21 июля 09:43, где Swapnil — это имя каталога. Я не хочу, чтобы все остальное, приятель, просто имя каталога, которое я должен отображать в дереве. Я не могу показать все эти детали в дереве. Любые предложения или модификации? - person Swapnil Gupta; 22.07.2010
comment
@Swapnil Gupta, это не ошибка кода, что вы получаете результат в HTML, это настройки вашего FTP-сервера. - person nightcoder; 03.10.2011
comment
@mint привет, я попробовал ваш код, но я получаю сообщение об ошибке имени объекта: «System.Net.Sockets.NetworkStream». - person Reynan; 05.07.2016

Вероятно, вы ищете PrintWorkingDirectory

person leppie    schedule 21.07.2010
comment
Когда я использую PrintWorkingDirectory, это дает мне ошибку: запрошенная команда FTP не поддерживается при использовании HTTP-прокси FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri); ftpRequest.Credentials = новый NetworkCredential(..., ...); ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; Ответ FtpWebResponse = (FtpWebResponse)ftpRequest.GetResponse(); //Ошибка StreamReader streamReader = new StreamReader(response.GetResponseStream()); Строка sResult = streamReader.ReadToEnd(); потокЧтение.Закрыть(); - person Swapnil Gupta; 21.07.2010
comment
Попробуйте изменить ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory на ftpRequest.Method = WebRequestMethods.Ftp.PrintWorkDirectory в вашем коде... - person mint; 21.07.2010
comment
@monO: запрошенная команда FTP не поддерживается при использовании прокси-сервера HTTP. Это исключение я получаю в строке FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse(); - person Swapnil Gupta; 21.07.2010

Вам понадобится ListDirectory со списком содержимое каталога

EDIT: Или вы можете использовать эту библиотеку Chilkat. это красиво оборачивает его для вас

person Iain Ward    schedule 21.07.2010
comment
ListDirectory также отображает результаты в формате XML. Мне нужны только удаленные системные каталоги, потому что мне нужно связать имена этих каталогов с древовидной структурой. Получение XML не будет работать для меня. Спасибо. - person Swapnil Gupta; 21.07.2010
comment
Да, я прошел через библиотеку Chilkat, но я не хочу использовать какую-либо третью сторону. Спасибо. Любое другое предложение у вас есть? - person Swapnil Gupta; 21.07.2010
comment
Я не думаю, что он вернет что-то, кроме xml, но я могу ошибаться. Возможно, вам придется просто разобрать xml в текст, если вы не можете указать httpwebresponse для возврата простого текста? - person Iain Ward; 21.07.2010

Некоторые прокси-серверы переформатируют список каталогов, поэтому довольно сложно надежно проанализировать список каталогов, если вы не можете гарантировать, что прокси-сервер не изменится.

person Konektiv    schedule 21.02.2012

Самый простой и эффективный способ получить содержимое каталога FTP:

var content = GetFtpDirectoryContents(новый Uri("ftpDirectoryUri"), new NetworkCredential("userName", "password"));

    public static List<string> GetFtpDirectoryContents(Uri requestUri, NetworkCredential networkCredential)
    {
        var directoryContents = new List<string>(); //Create empty list to fill it later.
        //Create ftpWebRequest object with given options to get the Directory Contents. 
        var ftpWebRequest = GetFtpWebRequest(requestUri, networkCredential, WebRequestMethods.Ftp.ListDirectory);
        try
        {
            using (var ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse()) //Excute the ftpWebRequest and Get It's Response.
            using (var streamReader = new StreamReader(ftpWebResponse.GetResponseStream())) //Get list of the Directory Contentss as Stream.
            {
                var line = string.Empty; //Initial default value for line.
                do
                {
                    line = streamReader.ReadLine(); //Read current line of Stream.
                    directoryContents.Add(line); //Add current line to Directory Contentss List.
                } while (!string.IsNullOrEmpty(line)); //Keep reading while the line has value.
            }
        }
        catch (Exception) { } //Do nothing incase of Exception occurred.
        return directoryContents; //Return all list of Directory Contentss: Files/Sub Directories.
    }

    public static FtpWebRequest GetFtpWebRequest(Uri requestUri, NetworkCredential networkCredential, string method = null)
    {
        var ftpWebRequest = (FtpWebRequest)WebRequest.Create(requestUri); //Create FtpWebRequest with given Request Uri.
        ftpWebRequest.Credentials = networkCredential; //Set the Credentials of current FtpWebRequest.

        if (!string.IsNullOrEmpty(method))
            ftpWebRequest.Method = method; //Set the Method of FtpWebRequest incase it has a value.
        return ftpWebRequest; //Return the configured FtpWebRequest.
    }
person Ahmed Sabry    schedule 09.11.2017

В следующей ссылке есть метод GetDirectoryInformation(), который рекурсивно извлекает файлы и каталоги из каталога FTP.

Рекурсивное получение файлов из каталога FTP

person Pabitra Dash    schedule 01.03.2016

Если вы хотите перечислить имена файлов, которые находятся внутри каталога de, вы должны указать (reqFTP.Proxy = null;) перед вызовом (reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;).

Надеюсь, это поможет вам!

person DarkFurious    schedule 30.10.2014