C#におけるファイル操作は.NETのAPIを用いる方法とWinRT APIを用いる方法があります。特にWinRT APIを用いるとファイルやフォルダ自体をオブジェクトとして扱うことができるので、よりオブジェクト指向的なコーディングが可能になります。ここでは、WinRT APIを用いた基本的なファイルの操作方法について説明します。
開発環境
- .NET 6.0
- WinUI 3.0 (Windows App SDK 1.0)
- WinRT Build 22000
WinRT APIにおけるファイルとフォルダ
WinRT APIではファイルを表すStorageFileクラスとフォルダを表すStorageFolderクラスがあります。
StorageFolderクラスの扱い方については以下の記事をご覧ください。
ここでは、StorageFileクラスの扱い方について説明します。
StorageFileインスタンスの取得
StorageFileクラスのGetFileFromPathAsyncメソッドを用いてファイルパスから直接ファイルを指定してStorageFileのインスタンス(storageFile)を作成することができます。例えば、「C:\BioTech-Lab\sample.txt」をStorageFileインスタンスとして取得する場合は次のようにします。
StorageFile storageFile = await StorageFile.GetFileFromPathAsync(@"C:\BioTech-Lab\sample.txt");
また、ユーザーにファイルを選択してもらう場合は、以下のようにファイル選択ダイアログを表示させることも可能です。
ファイル・プロパティの取得
Windowsにおけるファイルのプロパティは「最上位プロパティ」「基本プロパティ」「拡張プロパティ」の3種類があります。
- 最上位プロパティ:ファイル属性、コンテンツの種類、作成日、表示名、ファイルの種類など
- 基本プロパティ:ファイルサイズ、最終変更日
- 拡張プロパティ:(ファイルの内容に関連付けられて定義されている)
最上位プロパティの取得
最上位プロパティStorageFileインスタンス(storageFile)自体のプロパティとして取得することができます。
// 最上位プロパティの取得
string attributes = storageFile.Attributes.ToString(); // 属性
string contentType = storageFile.ContentType; // コンテンツ・タイプ
string displayType = storageFile.DisplayType; // 表示タイプ
string fileType = storageFile.FileType; // 拡張子
string displayName = storageFile.DisplayName; // 表示名(拡張子なし)
string name = storageFile.Name; // ファイル名(拡張子あり)
string path = storageFile.Path; // フォルダ・パス
DateTimeOffset dateCreated = storageFile.DateCreated; // 作成日時
例えばsample.txtというテキストファイルの場合は、ここで取得するプロパティは次のようになります。
- Attributes → “Normal” / “Archive” / “ReadOnly” など
- ContentType → “text/plain”
- DisplayType → “TXT File”
- FileType → “.txt”
- DisplayName → “sample”
- Name → “sample.txt”
- Path → (ファイルパス)
- DateCreated → (作成日時)
基本プロパティの取得
基本プロパティはStorageFileインスタンスのGetBasicPropertiesAsyncメソッドでBasicPropertiesインスタンスとして取得します。
// 基本プロパティの取得
BasicProperties basicProperties = await storageFile.GetBasicPropertiesAsync();
ulong fileSize = basicProperties.Size; // ファイルサイズ (単位:バイト)
DateTimeOffset dateModified = basicProperties.DateModified; // 更新日時
拡張プロパティの取得
拡張プロパティはPropertiesプロパティでStorageItemContentPropertiesインスタンスを取得してから、GetImagePropertiesAsyncメソッドやGetDocumentPropertiesAsyncメソッドなどの取得したい拡張プロパティに対応したメソッドで取得します。
拡張プロパティはファイルの種類ごとに異なり、例えば画像ファイルであれば画像の拡張プロパティを表すImagePropertiesインスタンスが取得でき、解像度や撮影日時、撮影場所などの画像データに関連した情報が含まれています。
// 拡張プロパティの取得
ImageProperties imageProperties = await storageFile.Properties.GetImagePropertiesAsync();
DateTimeOffset dateTaken = imageProperties.DateTaken; // 撮影日時
ファイルの種類ごとの拡張プロパティはそれぞれ以下で定義されています。
- 文書ファイル:DocumentPropertiesクラス
- 画像ファイル:ImagePropertiesクラス
- ミュージックファイル:MusicPropertiesクラス
- ビデオファイル:VideoPropertiesクラス
ファイルの基本的な操作
StorageFileインスタンス(storageFile)に対する名前変更・コピー・移動・削除などの基本的な操作方法を説明します。
ファイル名の変更
- ファイル名の変更:RenameAsyncメソッド
引数に新しい名前を指定することで、ファイル名の変更ができます。
// ファイル名を変更する
await storageFile.RenameAsync("新しい名前.txt");
ファイルの削除
- ファイルの削除:DeleteAsyncメソッド
ファイルを削除する場合は、そのStorageFileインスタンスのDeleteAsyncメソッドを呼び出します。
// ファイルを削除する
await storageFile.DeleteAsync();
ファイルのコピー・移動
- ファイルのコピー:CopyAsyncメソッド
- ファイルの移動:MoveAsyncメソッド
CopyAsyncメソッドの引数にコピー先のフォルダをStorageFolderインスタンスで指定することでファイルをそのフォルダにコピーできます。この時、コピー先のファイルパスを指定することはできず、StorageFolderインスタンスとして指定する必要があることに注意してください。また、第2引数にファイル名を指定することでファイル名を変更することも可能です。
// ファイルを指定のフォルダ―にコピーする
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\tmp");
await storageFile.CopyAsync(storageFolder);
// ファイルを指定のフォルダ―にコピーして、ファイル名を変える
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\tmp");
await storageFile.CopyAsync(storageFolder, "新しいファイル名.txt");
なお、上記のコードではコピー先に同じ名前のファイルが存在していると例外が発生するので、そのような場合は第3引数にNameCollisionOption列挙型でどういう処理をするかを指定します。
ファイルの移動はコピーと同様に行うことが可能で、先ほどのCopyAsyncメソッドをMoveAsyncメソッドに置き換えるだけでOKです。
// ファイルを指定のフォルダ―に移動する
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\tmp");
await storageFile.MoveAsync(storageFolder);
// ファイルを指定のフォルダ―に移動して、ファイル名を変える
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\tmp");
await storageFile.MoveAsync(storageFolder, "新しいファイル名.txt");
ファイルの所属する親フォルダの取得
そのファイルが所属する親フォルダはGetParentAsyncメソッドで取得できます。
// 親フォルダを取得する
StorageFolder storageFolder = await storageFile.GetParentAsync();
コメント