2017年11月26日日曜日

ファイルの種別判定にはlibmagic使おう

ファイルの種類を判定する


ファイルの種類を判定するのに拡張子から判定するやり方だと、ちょっと乱暴な感じがしたので調べてみた。
思い浮かぶのが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 件のコメント:

コメントを投稿