同一のファイルに複数の処理をする場合には、FileよりFileInfoのメソッドを呼ぶようにすることで、パスに対するセキュリティ チェックを一度だけにできます。Remarks - FileInfo Class (System.IO) | Microsoft Learn
public FileInfo (string fileName);FileInfo(String) コンストラクター (System.IO) | Microsoft Learn
コンストラクタではfileNameの存在やアクセス権は考慮されず、属性やサイズを取得しようとしたときに存在していないとFileNotFoundExceptionが投げられます。FileInfo - FileInfo
fileNameはPathのメソッドで解釈されてから格納されるため、NameやFullNameから取得するとfileNameとは異なる値となっていることがあります。
FileInfo file1 = new FileInfo("c:\\dir\\sample.txt"); string n1a = file1.Name; // "sample.txt" string n1b = file1.FullName; // "c:\\dir\\sample.txt" FileInfo file2 = new FileInfo("sample.txt"); string n2a = file2.Name; // "sample.txt" string n2b = file2.FullName; // "C:\\Projects\\test\\bin\\Debug\\sample.txt" FileInfo file3 = new FileInfo("\\dir\\"); string n3a = file3.Name; // "" string n3b = file3.FullName; // "C:\\dir\\"
プロパティからの初回の読み取り時、FileInfoはファイルの情報をキャッシュします。以降はそのキャッシュが返されるため、プロパティの値に影響するような操作をしたならばRefresh()を明示的に呼び情報を更新します。Examples - FileInfo Class (System.IO) | Microsoft Learn
型 | プロパティ | 内容 |
---|---|---|
string | Name | ファイルの名前。拡張子を含む |
string | FullName | ファイルの絶対パス |
string | DirectoryName | ディレクトリの絶対パス |
string | Extension | ファイルの拡張子 |
bool | Exists | ファイルが存在するならば、true |
bool | IsReadOnly | 読み取り専用ならば、true |
long | Length | ファイルのサイズ。バイト単位 |
FileAttributes | Attributes | 属性 |
DateTime | CreationTime | 作成日時 |
DateTime | LastWriteTime | 更新日時 |
DateTime | LastAccessTime | アクセス日時 |
DirectoryInfo | Directory | 親ディレクトリ |
FileInfo file = new FileInfo("c:\\dir\\sample.txt"); string str1 = file.Name; // "sample.txt" string str2 = file.FullName; // "c:\\dir\\sample.txt" string str3 = file.DirectoryName; // "c:\\dir" string str4 = file.Extension; // ".txt"
型 | フィールド | |
---|---|---|
string | FullPath | ファイルまたはディレクトリの絶対パス |
string | OriginalPath | ユーザーから最初に指定された、相対または絶対パス |
ユーザーから最初に指定された (originally specified) パスとありますが、FileSystemInfo.OriginalPath Field (System.IO) | Microsoft Learn
インスタンスを生成した最初ではなく、Pathクラスで解釈される前の値が保持されています。
このフィールドはprotectedですが、派生クラス以外ではToString()で同様のパスを得られます。
FileInfo file = new FileInfo("\\1.txt"); FieldInfo field = typeof(FileInfo).GetField("OriginalPath", BindingFlags.NonPublic | BindingFlags.Instance); string n1 = file.FullName; // "C:\\1.txt" string o1 = (string)field.GetValue(file); // "\\1.txt" string t1 = file.ToString(); // "\\1.txt" file.MoveTo("\\2.txt"); string n2 = file.FullName; // "C:\\2.txt" string o2 = (string)field.GetValue(file); // "\\2.txt" (変更されている) string t2 = file.ToString(); // "\\2.txt"
内部的な処理はFileと共通のため、処理内容や注意点は同じです。
メソッド | 機能 |
---|---|
Refresh() | オブジェクトの状態を更新できる |
MoveTo(String) | ファイルを新しい場所へ移動できる |
キャッシュされるのは_dataInitialisedフィールドを参照するプロパティで、
と、これらを呼び出すCreationTimeなどが該当します。よってRefresh()の呼び出しが必要なのは、これらのプロパティが変更されている場合のみです。
FileSystemInfo.Refresh メソッド (System.IO) | Microsoft Learn Refresh - filesysteminfo.cs
ファイルを作成できます。
public System.IO.FileStream Create ();FileInfo.Create メソッド (System.IO) | Microsoft Learn
内部ではFile.Create()を呼ぶだけです。Create - fileinfo.cs
作成したファイルは戻り値のFileStreamを通して操作します。これを閉じるまでは、削除などの操作はできません。
FileInfo file = new FileInfo("a.txt");
file.Create();
file.Delete(); // IOException「別のプロセスで使用されているため、プロセスはファイル 'a.txt' にアクセスできません。」
FileInfo file = new FileInfo("a.txt");
FileStream fs = file.Create();
fs.Close();
file.Delete(); // OK
ファイルをコピーできます。
public System.IO.FileInfo CopyTo ( string destFileName, bool overwrite );CopyTo(String, Boolean) - FileInfo.CopyTo メソッド (System.IO) | Microsoft Learn
CopyTo()でコピーしても、インスタンスのパスは変更されません。
FileInfo file = new FileInfo("a.txt"); string name1 = file.Name; // a.txt file.CopyTo("b.txt"); string name2 = file.Name; // a.txt (変更されていない)
ファイルを移動できます。
public void MoveTo (string destFileName);FileInfo.MoveTo メソッド (System.IO) | Microsoft Learn
MoveTo()で移動すると、インスタンスのパスも変更されます。
FileInfo file = new FileInfo("a.txt"); string name1 = file.Name; // a.txt file.MoveTo("b.txt"); string name2 = file.Name; // b.txt (変更されている)
移動先にファイルが存在すると、「既に存在するファイルを作成することはできません。」としてIOExceptionが投げられます。
ファイルを置換できます。
public System.IO.FileInfo Replace ( string destinationFileName, string destinationBackupFileName );Replace(String, String) - FileInfo.Replace メソッド (System.IO) | Microsoft Learn
インスタンスが表すファイルのパスがdestinationFileNameに変更され、destinationFileNameのパスがdestinationBackupFileNameになります。
MoveTo()とは異なり、成功してもインスタンス自体のパスは変更されず、新しいパスのインスタンスが返されます。
内部では、File.Replace()を呼ぶだけです。Replace - fileinfo.cs