Как разобрать это? ftpWebRequest ListDirectorDetials - PullRequest
5 голосов
/ 19 сентября 2011

Я играю с FtpWebRequest и мне интересно, как я могу отформатировать результат?

    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create("");
        ftp.Credentials = new NetworkCredential("", "");
       ftp.KeepAlive = true;
       ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
       WebResponse response = ftp.GetResponse();
       StreamReader reader = new StreamReader(response
                                       .GetResponseStream());

       string r = reader.ReadLine();
       response.Close();
       reader.Close();

Я получаю подобные результаты обратно

09-17-11  01:00AM               942038 my.zip

Что было бы хорошим способом разобрать это как объект, который говорит что-то вроде

public Class Test()
{
   public DateTime DateCreated? {get; set;}
   public int/long  Size {get; set;}
   public string  Name {get; set;}
}

Не уверен, должен ли я использовать long или int для размера. Я также не уверен, что на самом деле дата и время, если он создан, или изменен или что-то еще.

Ответы [ 3 ]

7 голосов
/ 20 сентября 2011
var value = "09-17-11  01:00AM               942038 my.zip";
var tokens = value.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length > 3)
{
    var test = new Test
    {
        DateCreated = DateTime.ParseExact(tokens[0] + tokens[1], "MM-dd-yyHH:mmtt", CultureInfo.InvariantCulture),
        Size = int.Parse(tokens[2]),
        Name = tokens[3]
    };

    // at this stage:
    // test.DateCreated = 17/09/2011 01:00AM
    // test.Size = 942038
    // test.Name = "my.zip"
}
1 голос
/ 20 сентября 2011

Раздражающая вещь в стандарте FTP заключается в том, что он не определяет точно, как должен быть отформатирован список каталогов. В общем, списки, возвращаемые с машин * nix, больше похожи на списки каталогов * nix, а списки, возвращаемые из Windows, часто очень похожи на списки DOS, но у вас есть старый FTP-код, составляющий основу более новых продуктов, поэтому есть IBM-4690 и AS400 вещи, VMS, Oracle, Novell и так далее.

Так что, если вы пытаетесь сделать что-то общее, а не для конкретного сервера, то вам предстоит выполнить много отвратительной работы по синтаксическому анализу. Это может стоить вашего времени, чтобы купить что-то, но у меня нет никаких рекомендаций.

0 голосов
/ 13 августа 2013

Это мой алгоритм синтаксического анализа ListDirectoryDetails.Я разделил имя файла / каталога, атрибут, дату создания и размер в список.Надеюсь, это поможет ....

        FtpWebRequest _fwr = FtpWebRequest.Create(uri) as FtpWebRequest;
        _fwr.Credentials = cred;
        _fwr.UseBinary = true;
        _fwr.UsePassive = true;
        _fwr.KeepAlive = true;
        _fwr.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        StreamReader _sr = new StreamReader(_fwr.GetResponse().GetResponseStream());

        List<object> _dirlist = new List<object>();
        List<object> _attlist = new List<object>();
        List<object> _datelist = new List<object>();
        List<long> _szlist = new List<long>();
        while (!_sr.EndOfStream)
        {
            string[] buf = _sr.ReadLine().Split(' ');
            //string Att, Dir;
            int numcnt = 0, offset = 4; ;
            long sz = 0;
            for (int i = 0; i < buf.Length; i++)
            {
                //Count the number value markers, first before the ftp markers and second
                //the file size.
                if (long.TryParse(buf[i], out sz)) numcnt++;
                if (numcnt == 2)
                {
                    //Get the attribute
                    string cbuf = "", dbuf = "", abuf = "";
                    if (buf[0][0] == 'd') abuf = "Dir"; else abuf = "File";
                    //Get the Date
                    if (!buf[i+3].Contains(':')) offset++;
                    for (int j = i + 1; j < i + offset; j++)
                    {
                        dbuf += buf[j];
                        if (j < buf.Length - 1) dbuf += " ";
                    }
                    //Get the File/Dir name
                    for (int j = i + offset; j < buf.Length; j++)
                    {
                        cbuf += buf[j];
                        if (j < buf.Length - 1) cbuf += " ";
                    }
                    //Store to a list.
                    _dirlist.Add(cbuf);
                    _attlist.Add(abuf);
                    _datelist.Add(dbuf);
                    _szlist.Add(sz);

                    offset = 0;
                    break;
                }
            }
        }
...