ファイルの情報というとファイルの中身の印象があるかもしれませんが、ファイルには中身以外の情報もたくさんあります。
C#でファイルの情報を扱うときには、System.IO.FileInfoクラスを使います。
ファイルの名前やパスを取得する
「ファイルを扱うのになぜわざわざ名前とパスを取得するの?」と思われるかもしれませんが、ファイルの指定は固定文字列だけでありませんので指定されたファイルの文字列を解析する必要性があります。
その時にこのSystem.IO.FileInfoクラスはとても役に立ちます。
下記のようなコードでファイル名やパスを取り扱います。
static void Main(string[] args) { // この変数でファイルを指定します string file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\test.txt"; System.IO.FileInfo fi = new System.IO.FileInfo(file_path); if(!fi.Exists) { Console.WriteLine("File is not exists!! {0}", file_path); // ここではわざと下の処理に行くようにしています } // ファイル名と拡張子 Console.WriteLine("FileInfo Name={0}", fi.Name); // ドライブ名 フォルダ ファイル名 拡張子 Console.WriteLine("FileInfo FullName={0}", fi.FullName); // ドライブ名 フォルダ Console.WriteLine("FileInfo DirectoryName={0}", fi.DirectoryName); Console.WriteLine("FileInfo Directory.FullName={0}", fi.Directory.FullName); // これはファイルがあるフォルダ名だけ取得できます Console.WriteLine("FileInfo Directory.Name={0}", fi.Directory.Name); // ファイルの拡張子('.'つきです) Console.WriteLine("FileInfo Extension={0}", fi.Extension); // 拡張子抜きのファイル名はないので作ります Console.WriteLine("FileInfo Name only={0}", fi.Name.Replace(fi.Extension, "")); }
サンプル中に、ファイルの存在チェックをして「ここではわざと下の処理に行くようにしています」で続きの処理をしていますが、この処理で例外等は発生しません。
理由は、これらの処理は「ファイルパスの文字列操作」だけなので、ファイルの実体とは関連がないからです。
ファイルサイズを取得する(Lengthプロパティ)
ファイルサイズを取得するにはFileInfoクラスのLengthプロパティを使います。
単位はバイト単位です。
下記のサンプルは、ファイルが存在しないと例外になります。
static void Main(string[] args) { // この変数でファイルを指定します string file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\test.txt"; System.IO.FileInfo fi = new System.IO.FileInfo(file_path); // ドライブ名 フォルダ ファイル名 拡張子 Console.WriteLine("FileInfo FullName={0}", fi.FullName); // ファイルのサイズを取得します Console.WriteLine("FileInfo Size={0}(bytes)", fi.Length); }
下記のようにします。
ファイルが存在して空(サイズが0バイト)のファイルでも、0バイトのファイルとしてサイズの取得ができます。
static void Main(string[] args) { // この変数でファイルを指定します string file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\test.txt"; System.IO.FileInfo fi = new System.IO.FileInfo(file_path); // ドライブ名 フォルダ ファイル名 拡張子 Console.WriteLine("FileInfo FullName={0}", fi.FullName); if (fi.Exists) { // ファイルのサイズを取得します Console.WriteLine("FileInfo Size={0}(bytes)", fi.Length); } else { // ファイルがないのでサイズの取得ができません Console.WriteLine("File is not exists!! {0}", file_path); return; } }
ファイルが読み取り専用かをチェックする(IsReadOnlyプロパティ)
ファイルには「読み取り専用」という属性があり、この属性がセットされているとファイルへの書き込み(変更)はできません。
サンプルは、下記のようになります。
static void Main(string[] args) { // この変数でファイルを指定します string file_path = @"D:\work\test\FileInfoTest1\FileInfoTest1\atest.txt"; System.IO.FileInfo fi = new System.IO.FileInfo(file_path); if (fi.IsReadOnly) { // このファイルが読み取り専用だった場合 Console.WriteLine("This file is read only. {0}", file_path); } else { // このファイルが読み取り専用ではない場合 Console.WriteLine("This file is not read only. {0}", file_path); } }
このコードですが、ファイルの属性を知るにファイルが存在しなければならないので、「ファイルが存在しないと例外が出る」と思われるかもしれませんが、実はここで例外は発生しません。
ファイルが存在しない場合のIsReadOnlyプロパティの値は’true'(読み取り専用)が返ります。
true(読み取り専用)が返る理由は、「存在しないファイルには書けない」という状態に合わせているからです。
ですので、このIsReadOnlyプロパティでtrueが返ってきたから「ファイルが存在している」とは言えませんので、System.IO.File.ExistsメソッドやSystem.IO.FileInfo.Existsメソッドでちゃんとチェックするようにしましょう。