let stat filename =
    try
      let stats = Unix.stat filename
      in
      let kind = 
        match stats.Unix.st_kind with
          Unix.S_REG -> File 
        | Unix.S_DIR -> Dir 
        | Unix.S_CHR -> Dev_char 
        | Unix.S_BLK -> Dev_block
        | Unix.S_LNK -> Link
        | Unix.S_FIFO -> Fifo 
        | Unix.S_SOCK -> Socket
      in
      let is_link = 
        let stats = Unix.lstat filename 
        in
        stats.Unix.st_kind = Unix.S_LNK
      in
      {
        kind              = kind;
        is_link           = is_link;
        permission        = permission_of_int stats.Unix.st_perm;
        size              = B (float_of_int stats.Unix.st_size);
        owner             = stats.Unix.st_uid;
        group_owner       = stats.Unix.st_gid;
        access_time       = stats.Unix.st_atime;
        modification_time = stats.Unix.st_mtime;
        creation_time     = stats.Unix.st_ctime;
      }
    with Unix.Unix_error(_) ->
      raise FileDoesntExist