使用 C# 解析 FTP ListDirectoryDetails 响应
监视 FTP 位置的更新时,必须从 WebRequestMethods 返回的响应中提取信息。 Ftp.ListDirectoryDetails 方法。然而,不同的 FTP 服务器软件呈现不同的响应格式,给解析带来了挑战。
问题陈述
给出两种常见的响应格式(DOS/Windows 和 *nix) ,任务是找到一个完全托管的 C# 类,可以无缝处理这些差异并提取以下内容详细信息:
答案
DOS/Windows列表
对于第一个响应格式(DOS/Windows),以下 C# 代码有效地解析响应:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/"); request.Credentials = new NetworkCredential("user", "password"); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream()); string pattern = @"^(\d+-\d+-\d+\s+\d+:\d+(?:AM|PM))\s+(<DIR>|\d+)\s+(.+)$"; Regex regex = new Regex(pattern); IFormatProvider culture = CultureInfo.GetCultureInfo("en-us"); while (!reader.EndOfStream) { string line = reader.ReadLine(); Match match = regex.Match(line); string s = match.Groups[1].Value; DateTime modified = DateTime.ParseExact(s, "MM-dd-yy hh:mmtt", culture, DateTimeStyles.None); s = match.Groups[2].Value; long size = (s != "<DIR>") ? long.Parse(s) : 0; string name = match.Groups[3].Value; Console.WriteLine( "{0,-16} size = {1,9} modified = {2}", name, size, modified.ToString("yyyy-MM-dd HH:mm")); }
此代码将产生所需的输出:
Version2 size = 0 modified = 2011-08-10 12:02 image34.gif size = 144700153 modified = 2009-06-25 14:41 updates.txt size = 144700153 modified = 2009-06-25 14:51 digger.tif size = 144700214 modified = 2010-11-04 14:45
其他 (*nix)列表
对于其他 *nix 列表,建议使用 MLSD 命令。 MLSD 返回机器可读的列表格式,无需进行复杂的解析。
替代库
为此目的使用 FtpWebRequest 类可能不可靠。考虑使用第三方库,例如 WinSCP .NET 程序集,它支持 MLSD,并且可以回退到 LIST 命令来处理各种响应格式。
以上是如何在 C# 中解析 FTP ListDirectoryDetails 响应以可靠地提取文件信息?的详细内容。更多信息请关注PHP中文网其他相关文章!