[UWP][ファイル操作] 最近使用したファイルを取得する(2)

前回と前々回の記事で最近使用したファイルの登録と取得方法について見ていきました。

前回の記事で、説明した最近使用したファイルの取得方法では、最後に使用したファイルしか取得できません。

今回は、最近使用したファイル一覧に登録されているすべてのファイルを取得する方法を見ていきます。

はじめにMostRecentlyUsedListプロパティを取得します。続いてforeach構文を使用して、取得したオブジェクトのEntitiesから1つずつ最近使用したファイルを取得します。

最近使用したファイルは、MostRecentlyUsedListプロパティのGetItemAsyncメソッドで取得できます。戻り値のデータ型はIStorageItemで、Nameプロパティでファイル名を、Pathプロパティでフルパスを取得することができます。

var mru = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList;

foreach (Windows.Storage.AccessCache.AccessListEntry entry in mru.Entries)
{
    string token = entry.Token;
    string metadata = entry.Metadata;
    Windows.Storage.IStorageItem item = await mru.GetItemAsync(token);

    // ファイル名のみ取得
    string fileName = item.Name;
    // ファイル名を含むフルパスを取得
    string fullPath = item.Path;
}

[UWP][ファイル操作] 最近使用したファイルを取得する(1)

前回に記事で、最近使用したファイル一覧へのファイルの追加方法について学びました。

今回は、最近使用したファイル一覧に最後に追加されたフィルをを取得する方法を見ていきます。

はじめに、前回Addメソッドを実行したときの戻り値が返したトークンがあることを確認します。

トークンがある場合には、前回紹介したMostRecentlyUsedListプロパティを取得し、GetFileAsyncメソッドを使用して、最近使用したファイルを取得します。このメソッドの引数にはトークンを指定します。戻り値は、トークンに対応する最近使用したファイルが返されます。

ファイル名を取得したい場合はDisplayNameプロパティを、フルパスを取得したい場合はPathプロパティを使用します。

// トークンがあれば
if (!string.IsNullOrEmpty(_mruToken))
{
    var mru = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList;

    // 最近使ったファイルを取得する
    Windows.Storage.StorageFile recentlyFile = await mru.GetFileAsync(_mruToken);

    // ファイル名のみ取得
    string fileName = recentlyFile.DisplayName;

    // ファイル名を含むフルパスを取得
    string fullPath = recentlyFile.Path;
}

[UWP][ファイル操作] 最近使用したファイルの登録

今回は、最近使用したファイル一覧へ、使用したファイルを追加する方法について見ていきます。

最近使用したファイルは StorageApplicationPermissions クラスの MostRecentlyUsedListプロパティで管理します。このプロパティにはAddメソッドがあり、第1引数に最近使用したファイル一覧へ登録するファイル名を、第2引数にはメタデータを指定します。このメタデータはstring型で、主に一覧の使用目的等を入力します。Addメソッドは第2引数を省略して使用することも可能です。Addメソッドを使用して一覧への登録が完了すると、ファイル一覧を取得するときに一意に識別をできるようにするためのトークンが返されます。

以下に、最近使用したファイルを登録する例を示します。

ファイルピッカーで選択したファイルを、一覧に登録します。

private string _mruToken = string.Empty;

// ファイルピッカーの準備
var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
filePicker.FileTypeFilter.Add(".txt");

// ファイルピッカーでユーザーにファイルを選択させる
Windows.Storage.StorageFile file = await filePicker.PickSingleFileAsync();

// 最近使用したファイル一覧を管理するプロパティの準備
var mru = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList;

// 最近使用したファイル一覧へファイルの登録
_mruToken = mru.Add(file, "MyApp");

[UWP][全般] アプリデータをファイルで読み書きする

以前、「アプリケーションデータの場所を取得する」の記事でアプリデータ用のファイルが保存されるディレクトリの取得方法について説明しました。

今回はこのディレクトリに対して、アプリデータをファイルに書き込んだり読み込んだりする方法について見て行きましょう。

データを書き込む場合は、はじめにファイルを作成します。ファイルを作成するにはStorageFolderクラスのCreateFileAsyncメソッドを使用します。第1引数に作成するファイル名、第2引数にオプションを指定します。このオプションはすでにファイルが存在する場合に上書き保存する(ReplaceExisting)といった、CreationCollisionOption列挙体の値を指定します。あとは、作成したファイルへデータを書き込みます。データを書き込むにはFileIOクラスのWriteTextAsyncメソッドを使用します。第1引数には作成したファイルを、第2引数には書き込むデータを指定します。

続いてデータの読み込みについて見ていきましょう。データを読み込む場合は、StorageFolderクラスのReadTextAsyncメソッドを使用します。引数には、読み込むデータが書かれているファイル名を指定します。次にFileIOクラスのReadTextAsyncメソッドを使用してデータを読み込みます。引数には読み取るファイルを指定します。

以下に読み書きの例を示します。MainPage.xamlにはButton2つとTextBoxを1つ配置します。

public sealed partial class MainPage : Page
{
    // 保存先のディレクトリを取得
    Windows.Storage.StorageFolder localFolder =
        Windows.Storage.ApplicationData.Current.LocalFolder;

    public MainPage()
    {
        this.InitializeComponent();
    }

    // データの読み込み
    private async void btnGetData_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            Windows.Storage.StorageFile sampleFile = await localFolder.GetFileAsync("appData.txt");
            String myData = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);

            txtData.Text = myData;
        }
        catch (Exception)
        {
            // データが存在しない場合の処理
        }

    }

    // データの書き込み
    private async void btnDataSave_Click(object sender, RoutedEventArgs e)
    {
        // データ書き込み先のファイルを作成
        //(ファイル作成時のオプションは、既存の入るがある場合に置換する)
        Windows.Storage.StorageFile appFile = 
            await localFolder.CreateFileAsync("appData.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting);

        // 作成したファイルへのデータ書き込み
        await Windows.Storage.FileIO.WriteTextAsync(appFile, txtData.Text;
    }
}

実行例

 

 

[UWP][ファイル操作] ファイルが保存できたかを確認する

前回に引き続き、今回もファイルの保存について見ていきます。

前回までのコードは以下の通りです。

private async void btnSave_Click(object sender, RoutedEventArgs e)
{
    var filePicker = new Windows.Storage.Pickers.FileSavePicker();

    // ユーザーが保存する場所
    filePicker.SuggestedStartLocation =
        Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;

    // 拡張子の種類を追加
    filePicker.FileTypeChoices.Add("テキストファイル", new List<string>() { ".txt" });
    filePicker.FileTypeChoices.Add("リッチテキストファイル", new List<string>() { ".rtf" });

    // ファイル名の候補
    filePicker.SuggestedFileName = "新しいドキュメント";

    // 名前を付けて保存ダイアログを表示
    Windows.Storage.StorageFile file = await filePicker.PickSaveFileAsync();

    if (file != null)
    {
        await Windows.Storage.FileIO.WriteTextAsync(file, textBox.Text);
    }
}

今回は、WriteTextAsyncメソッドでファイル保存命令を実行後、ファイル保存ができたかを確認する処理を追加します。

ファイルが保存できたかどうかを確認するにはCachedFileManager.CompleteUpdatesAsyncメソッドを使用します。

このメソッドの引数には、名前を付けて保存ダイアログの戻り値を渡します。

ファイルが正常に保存できた場合は、CachedFileManager.CompleteUpdatesAsyncメソッドはWindows.Storage.Provider.FileUpdateStatus.Completeを返します。よってif文で状態を確認し、正常に保存できた場合の処理、保存に失敗したい場合の処理を記述できるようになります。

コード例を以下に示します。

Windows.Storage.Provider.FileUpdateStatus status =
    await Windows.Storage.CachedFileManager.CompleteUpdatesAsync(file);

if (status == Windows.Storage.Provider.FileUpdateStatus.Complete)
{
    // 正常に保存された場合の処理
}
else
{
    // 保存できなかった場合の処理
}