ファイルの種類を判定する
ファイルの種類を判定するのに拡張子から判定するやり方だと、ちょっと乱暴な感じがしたので調べてみた。
思い浮かぶのがmagicぐらいしかないので、素直にやってみた。
fileコマンドが使っているライブラリ
多分fileコマンドのパッケージと一緒に入るライブラリにlibmagicっていうのがあって、これがmagicデータベースからファイル種別を判定してくれる。
gentooだとここにあるよ
cuomo@ugui7 ~ $ file /usr/share/misc/magic.mgc /usr/share/misc/magic.mgc: magic binary file for file(1) cmd (version 14) (little endian)
haskellで書いてみた
haskell-magicをいれる
ugui7 ~ # emerge dev-haskell/magic
コードから使ってみる
import Magic import Control.Monad (forM_) main :: IO () main = do magic <- magicOpen [] magicLoadDefault magic forM_ fileList $ \path -> do magicFile magic path >>= putStrLn fileList :: [String] fileList = [ "mishimahs2_original.jpg" , "ero_dehanai.wmv" , "jp106.map.gz" ]
cuomo@ugui7 ~/Code/haskell/magic $ runhaskell FileMagic.hs JPEG image data, JFIF standard 1.01, resolution (DPI), density 100x100, segment length 16, baseline, precision 8, 624x468, frames 3 Microsoft ASF gzip compressed data, max compression, from Unix cuomo@ugui7 ~/Code/haskell/magic $
fileコマンドと同じ出力をとれる
ちなみに、magicOpen関数の引数にMagicMimeTypeを設定すると
image/jpeg video/x-ms-asf application/x-gzip
ちゃんとmimeがとれる、その他指定できるフラグは
data MagicFlag = MagicNone | MagicDebug | MagicSymlink | MagicCompress | MagicDevices | MagicMimeType | MagicMimeEncoding | MagicMime | MagicContinue | MagicCheck | MagicPreserveAtime | MagicRaw | MagicError | UnknownMagicFlag Intがあるます、おおむねfileコマンドのオプションに指定可能なものがフラグになっているぽい
ファイル種別でした...
0 件のコメント:
コメントを投稿