C# を使用した FTP ListDirectoryDetails 応答の解析
更新のために FTP の場所を監視する場合、WebRequestMethods によって返された応答から情報を抽出することが不可欠です。 Ftp.ListDirectoryDetails メソッド。ただし、FTP サーバー ソフトウェアが異なると、さまざまな応答形式が表示され、解析の課題が生じます。
問題ステートメント
2 つの一般的な応答形式 (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 中国語 Web サイトの他の関連記事を参照してください。