2012年6月13日水曜日

FTPでのファイル一覧取得の壁

FTPで指定したディレクトリ下のファイル一覧はFTPの"LIST"コマンドによって取得できる。しかし、このコマンドで取得できる結果のフォーマットについて標準的な規定は無く、FTPサーバーの実装に依存する。

つまり結果がどんなフォーマットで来るか分からないために、パース処理の実装が極めて難しい。FileZillaのような優秀なFTPクライアントがこの問題をどう解決しているかというと、メジャーな各FTPサーバーに依存した血反吐を吐きそうなパース処理を頑張って書いているのである(directorylistingparser.cppを見ると3000行弱あった)。

CDirectoryListingParser::ParseAsUnix()とCDirectoryListingParser::ParseAsDos()で大体のFTPサーバーをカバーできてるっぽい。
マネージコードだったら、このソースをまんま使いとこだけどC++だしGPLだし厄介だなあ。

更に厄介なことにFTPはディレクトリを丸ごと削除ができず、子階層のファイルを一件一件削除していって空のディレクトにしてからでないと"RMD"コマンドでディレクトリ削除ができない。従って"LIST"コマンドでファイル一覧取得→各ファイルを"DELE"コマンドで削除していく→空になったフォルダを"RMD"コマンドで消す、といった手順を踏まないといけない。これでは最初の"LIST"の時点でもう躓いてしまう。

今回はIISへの対応になりそうだからやっつけパーサーで誤魔化すしかないのか・・・。

0 件のコメント:

コメントを投稿