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クラスがあります。
StorageFileクラスの扱い方については以下の記事をご覧ください。
ここでは、StorageFolderクラスの扱い方について説明します。
StorageFolderインスタンスの取得
StorageFolderクラスのGetFolderFromPathAsyncメソッドを用いて、ファイルパスから直接ファイルを指定してStorageFolderのインスタンス(storageFolder)を作成することができます。例えば、「C:\BioTech-Lab」フォルダをStorageFolderインスタンスとして取得する場合は次のようにします。
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\BioTech-Lab");
また、ユーザーにフォルダを選択してもらう場合は、以下のようにフォルダ選択ダイアログを表示させることも可能です。
フォルダに含まれるアイテムの取得
フォルダに含まれるファイルやフォルダはそれぞれ以下のメソッドでStorageFileやStorageFolderのリストとして取得することができます。
- ファイルのリストを取得する → GetFilesAsyncメソッド
- フォルダのリストを取得する → GetFoldersAsyncメソッド
また、特定のファイルやフォルダを取得する場合はGetFileAsyncメソッドやGetFolderAsyncメソッドの引数に取得したいファイル名やフォルダ名を指定することで取得できます。
フォルダ・プロパティの取得
基本的なプロパティの取得
フォルダのプロパティはStorageFolderインスタンス(storageFolder)のプロパティとして取得できます。
string attributes = storageFolder.Attributes.ToString(); // 属性 ("Directory"など)
string displayType = storageFolder.DisplayType; // 表示タイプ ("File folder"など)
string displayName = storageFolder.DisplayName; // 表示名
string path = storageFolder.Path; // フォルダ・パス
DateTimeOffset dateCreated = storageFolder.DateCreated; // 作成日時
なお、フォルダ・プロパティの取得方法はファイル・プロパティに準じていて、最上位プロパティ・基本プロパティ・拡張プロパティが定義されてはいますが、基本的に用いられるのはここで説明した最上位プロパティのみとなります。
フォルダに含まれるアイテム数・サイズを取得する
フォルダに含まれるファイル数やフォルダ数は、そのフォルダに含まれるファイル・フォルダのリストを取得して、その個数をカウントすることで取得できます。
int fileCount = (await storageFolder.GetFilesAsync()).Count; // ファイル数をカウント
int folderCount = (await storageFolder.GetFoldersAsync()).Count; // フォルダ数をカウント
フォルダのサイズを取得するためのメソッドは次のようにコーディングできます。
// フォルダのサイズを取得する (単位:バイト)
public static async Task<ulong> GetFolderSizeAsync(StorageFolder storageFolder)
{
ulong folderSize = 0;
// フォルダに含まれるファイル・サイズの合計を求める
foreach (StorageFile storageFile in await storageFolder.GetFilesAsync())
{
BasicProperties basicProperties = await storageFile.GetBasicPropertiesAsync();
ulong fileSize = basicProperties.Size;
folderSize += fileSize;
}
// フォルダの子フォルダについて再帰的に処理を行う
foreach (StorageFolder childStorageFolder in await storageFolder.GetFoldersAsync())
{
folderSize += await GetFolderSizeAsync(childStorageFolder);
}
return folderSize;
}
フォルダの基本操作
StorageFolderインスタンス(storageFolder)に対する名前変更・コピー・移動・削除などの基本的な操作方法を説明します。
フォルダの作成
- フォルダの作成:CreateFolderAsyncメソッド
CreateFolderAsyncメソッドの引数に作成したいフォルダ名を指定することで、新しいフォルダを作成することができます。
// フォルダを作成する
await storageFolder.CreateFolderAsync("新しいフォルダ");
フォルダ名の変更
- フォルダ名の変更:RenameAsyncメソッド
引数に新しい名前を指定することで、フォルダ名の変更ができます。
// フォルダ名を変更する
await storageFolder.RenameAsync("新しい名前");
フォルダの削除
- フォルダの削除:DeleteAsyncメソッド
フォルダ削除する場合は、そのStorageFolderインスタンスのDeleteAsyncメソッドを呼び出します。
// フォルダを削除する
await storageFolder.DeleteAsync();
フォルダのコピー・移動
StorageFolderクラスにはフォルダのコピーや移動を行うためのメソッドは用意されていません。そのため、再帰的にフォルダに含まれる要素を1つ1つコピー/移動する処理を行う必要があります。
フォルダをコピーするメソッドは次のようにコーディングできます。
// フォルダをコピーする
public static async Task<StorageFolder> CopyFolderAsync(StorageFolder originalFolder, StorageFolder destinationFolder)
{
StorageFolder createdFolder = await destinationFolder.CreateFolderAsync(originalFolder.Name);
// フォルダ内のファイルを1つずつコピーする
foreach (StorageFile storageFile in await originalFolder.GetFilesAsync())
{
await storageFile.CopyAsync(createdFolder);
}
// 子フォルダについて再帰的にコピーを行う
foreach (StorageFolder childFolder in await originalFolder.GetFoldersAsync())
{
await CopyFolderAsync(childFolder, createdFolder);
}
return createdFolder;
}
このメソッドを使って、以下のようにコピーを行います。
// コピーするフォルダを取得する
StorageFolder originalFolder = await StorageFolder.GetFolderFromPathAsync(@"****");
// コピー先のフォルダを取得する
StorageFolder destinationFolder = await StorageFolder.GetFolderFromPathAsync(@"****");
// コピーする
await CopyFolderAsync(originalFolder, destinationFolder);
このメソッドを用いて最後にコピー元のフォルダを削除すれば、「移動」とすることができます。
フォルダの所属する親フォルダの取得
そのフォルダが所属する親フォルダはGetParentAsyncメソッドで取得できます。
// 親フォルダを取得する
StorageFolder parentStorageFolder = await storageFolder.GetParentAsync();
コメント