2013年1月22日火曜日

Go言語でファイルサイズを調べる


こんにちは。scarvizです。

ファイル操作については色々書かれているのですが、ファイルサイズを調べるには
どうすれば良いのか分からなかったので、ちょっと調べてみました。

今回は「$GOROOT/src/pkg/os/file_unix.go」のソースコードを参考にしました。




■File型の変数からファイルサイズを調べる
ファイルをオープンした状態で色々扱ったりすると思うので、まずはFile型の変数からファイルサイズを取得する方法を紹介します。カレントディレクトリに「test.txt」というファイルを準備しています。
ファイルサイズは「102.5 kB (102,486 bytes)」です。
なお、以下のソースコードは「test.txt」がなくても新規に作成します。

package main

import (
 "fmt"
 "os"
)

func main() {
    // カレントディレクトリ
    cur, _ := os.Getwd()
 
    // ファイルパス(カレントディレクトリのtest.txt)
    filePath := cur + "/test.txt"
 
    // ファイルが存在する場合は追記、存在しない場合は新規作成
    file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)

    if err != nil {
        fmt.Println(err)
        return
    }
 
    // クローズ処理の遅延実行
    defer func(){
        file.Close()
    }()

    // ファイル情報取得
    fileinfo, staterr := file.Stat()
 
    if staterr != nil {
        fmt.Println(staterr)
        return
    }
 
    // ファイルサイズを表示
    fmt.Println(fileinfo.Size())
}

結果:
102486


ちなみにFile型変数からファイルパスを取得したい場合は
 path := file.Name()

とすれば取れます。

■ファイルを開かずにファイルサイズを調べる
大きなサイズのファイルを扱うなど、いちいち開かずにファイルサイズだけ調べたいという場合もあると思います。
ファイルパスからファイルサイズを調べる方法を紹介します。

package main

import (
    "fmt"
    "os"
)

func main() {
    // カレントディレクトリ
    cur, _ := os.Getwd()
 
    // ファイルパス(カレントディレクトリのtest.txt)
    filePath := cur + "/test.txt"
 
    // ファイルパスからファイル情報取得
    fileinfo, staterr := os.Stat(filePath)

    if staterr != nil {
        fmt.Println(staterr)
        return
    }
 
    // ファイルサイズを表示
    fmt.Println(fileinfo.Size())
}

結果:
102486


この方法は指定したファイルパスにファイルが存在しない場合はstaterrがnilでないので、仮にファイルの存在チェックをしたいというのでも使えますね。

0 件のコメント:

コメントを投稿