.NET TIPS

ファイルやディレクトリのサイズを取得するには?

デジタルアドバンテージ 遠藤 孝信
2005/09/30

 本稿では、ファイル・サイズおよびディレクトリ・サイズ(ディレクトリに含まれているファイルのサイズ合計)を取得する方法について解説する。

FileInfoクラスによるファイル・サイズの取得

 ファイル・サイズを取得するには、FileInfoクラス(System.IO名前空間)のLengthプロパティを利用する。FileInfoクラスはファイルやファイルの属性を操作するためのクラスだ。

 具体的には、次に示すように、サイズを取得したいファイルのパスをコンストラクタのパラメータに指定してFileInfoクラスのインスタンスを作成し、Lengthプロパティの値を取得すればよい。

string path = @"c:\WINDOWS\隅田川.bmp";
FileInfo fi = new FileInfo(path);
long size = fi.Length;
Dim path As String = "c:\WINDOWS\隅田川.bmp"
Dim fi As FileInfo = New FileInfo(path)
Dim size As Long = fi.Length
FileInfoクラスによるファイル・サイズの取得(上:C#、下:VB.NET)

 ファイルのサイズは整数型(Integer)ではなく長整数型(Long)の値である点に注意してほしい。また、クラス・ライブラリにはファイルのコピーや削除を行うためのメソッドを集めたクラスとしてFileクラス(System.IO名前空間)があるが(参考:「TIPS:ファイルをコピー/削除/リネーム/移動するには?」)、このクラスにはファイル・サイズを取得するメソッドが用意されていないため、ここで示したようにFileInfoクラスを利用する必要がある。

 なお、ファイルのストリームを開いているときには、FileStreamクラス(System.IO名前空間)のLengthプロパティからも、ファイル・サイズを取得することができる。

ディレクトリ・サイズの取得

 ファイルに対するFileInfoクラスのように、ディレクトリについてはDirectoryInfoクラス(System.IO名前空間)が用意されているが、このクラスにはディレクトリ・サイズを取得するためのプロパティは存在しない。

 従って、ディレクトリ・サイズを取得するには、まずDirectoryInfoクラスのGetFilesメソッドを利用して、そのディレクトリに含まれるファイルのFileInfoオブジェクト(の配列)を取得し、それぞれのファイル・サイズの合計を求める必要がある。

 さらに、すべてのサブディレクトリに含まれるファイルのサイズも合わせたディレクトリ・サイズが必要な場合には、ディレクトリ階層をたどりながらファイル・サイズの合計を求めていかなければならない。

 DirectoryInfoクラスにはGetDirectoriesメソッドが用意されており、そのディレクトリに含まれるすべてのサブディレクトリについてのDirectoryInfoオブジェクト(の配列)を取得できるため、このメソッドを利用すればディレクトリの階層をたどっていくことが可能だ。

 次のサンプル・プログラムは、FileInfoクラスとDirectoryInfoクラスを利用して、ディレクトリ(ここではc:\Inetpub)配下にあるすべてのファイルのサイズ合計を表示する。

// dirsize.cs

using System;
using System.IO;

public class DirectorySize {
  static void Main() {
    string path = @"c:\Inetpub";

    DirectoryInfo di = new DirectoryInfo(path);
    long dirSize = GetDirectorySize(di);
    Console.WriteLine(dirSize);
  }

  static long GetDirectorySize(DirectoryInfo dirInfo) {
    long size = 0;

    foreach (FileInfo fi in dirInfo.GetFiles()) {
      size += fi.Length;
    }
    foreach (DirectoryInfo di in dirInfo.GetDirectories()) {
      size += GetDirectorySize(di); // 再帰呼び出し
    }
    return size;
  }
}

// コンパイル方法:csc dirsize.cs
ディレクトリ・サイズを取得し表示するC#のサンプル・プログラム(dirsize.cs)
 
' dirsize.vb

Imports System
Imports System.IO

Public Class DirectorySize
  Shared Sub Main()
    Dim path As String = "c:\Inetpub"

    Dim di As DirectoryInfo = New DirectoryInfo(path)
    Dim dirSize As Long = GetDirectorySize(di)
    Console.WriteLine(dirSize)
  End Sub

  Shared Function GetDirectorySize(ByVal dirInfo As DirectoryInfo) As Long
    Dim size As Long = 0

    For Each fi As FileInfo In dirInfo.GetFiles
      size += fi.Length
    Next
    For Each di As DirectoryInfo In dirInfo.GetDirectories
      size += GetDirectorySize(di) ' 再帰呼び出し
    Next
    Return size
  End Function
End Class

' コンパイル方法:vbc dirsize.vb
ディレクトリ・サイズを取得し表示するVB.NETのサンプル・プログラム(dirsize.vb)

 このサンプル・プログラムでは、各ディレクトリのサイズを求めるGetDirectorySizeメソッドを再帰的に呼び出してディレクトリ階層をたどっている。DirectoryInfoクラスについては「TIPS:ファイルやディレクトリの一覧を取得するには?」でも解説しているので、そちらも参考にしていただきたい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:FileInfoクラス(System.IO名前空間)
使用ライブラリ:DirectoryInfoクラス(System.IO名前空間)
関連TIPS:ファイルをコピー/削除/リネーム/移動するには?
関連TIPS:ファイルやディレクトリの一覧を取得するには?
 
この記事と関連性の高い別の.NET TIPS
ファイルやディレクトリの一覧を取得するには?
ディレクトリを作成/削除/リネーム/移動するには?
ファイルやディレクトリをすべてのサブディレクトリから検索するには?
ファイルやディレクトリの一覧を効率的に取得するには?
ファイルをコピー/削除/リネーム/移動するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH