【问题标题】:How to parse this? ftpWebRequest ListDirectorDetials如何解析这个? ftpWebRequest ListDirectorDetials
【发布时间】:2011-09-19 19:57:19
【问题描述】:

我正在玩 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 作为大小。我也不确定如果创建、修改或其他日期时间实际上是什么。

【问题讨论】:

标签: c# .net parsing ftpwebrequest


【解决方案1】:
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"
}

【讨论】:

  • 啊。难怪为什么它对我不起作用。我已经做了 ''。想知道为什么它不分裂。不确定这是否是最好的方法,因为这似乎需要不断修复(好像我将它移动到另一个服务,他们可能有更多字段)
  • @chobo2,您始终可以使用第三方控件进行解析,并且在所有情况下都可以使用(当然,您必须定义 all case 的含义)。我只展示了一个使用标准 BCL 类的粗略示例,它当然只适用于这个特定的输出。
  • 是的,这就是我现在正在寻找的。我正在努力寻找一个免费的。我几乎在 nuget 上尝试了所有方法,但它们要么付费,要么没有带有文件大小的目录列表
【解决方案2】:

FTP 标准的一个令人讨厌的地方是它没有明确指定目录列表的格式。通常,从 *nix 机器返回的列表看起来更像 *nix 目录列表,而从 Windows 返回的列表通常看起来很像 DOS 列表,但是旧的 FTP 代码构成了新产品的基础,因此有 IBM-4690 和AS400 的东西,VMS,Oracle,Novell 等等。

因此,如果您尝试制作通用用途而不是特定服务器,那么您需要做很多难看的解析工作。可能值得您花时间买点东西,但我没有任何建议。

【讨论】:

    【解决方案3】:

    这是我解析 ListDirectoryDe​​tails 的算法。我将文件/目录名称、属性、创建日期和大小分成列表。希望这会有所帮助....

            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;
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2011-10-04
      相关资源
      最近更新 更多