今回はファイルの保存方法を紹介します。
まずは第一回と同様の方法でユーザーにファイルを選択させます。
// FileOpenPickerクラスでファイルを取得する
FileOpenPicker openPicker = new FileOpenPicker();
// 表示モードはサムネイル形式
openPicker.ViewMode = PickerViewMode.List;
// 最初はピクチャーライブラリーから立ち上がる
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile read_file = await openPicker.PickSingleFileAsync();
var read_stream = await read_file.OpenAsync(FileAccessMode.ReadWrite);
ファイルからデータを読み込むにはDataReader、ファイルを書き出すにはDataWriterを利用します。
ファイルを選択して書き出す処理の場合上記2つを利用することになるため混乱しやすいですね。
順番にコードを紹介していきます。
まずはDataReaderを利用してファイルデータを読み込みます。
以下のコードは上記のファイル選択を行った後で、その選択ファイルに対してストリームを取得する流れです。
// ファイル操作用のストリームを所得します
var read_stream = await read_file.OpenAsync(FileAccessMode.ReadWrite);
// 読みだしたデータを格納するためのバイト配列を用意します
var size = read_stream.Size;
byte[] buffer = new byte[size];
// DataReaderクラスでストリームからデータを読み出します
// 記述順によって「他のプロセスが利用していますエラー」が出るので注意
// GetInputStreamAtでDataReaderにインプットストリームを渡します
DataReader reader = new DataReader(read_stream.GetInputStreamAt(0));
await reader.LoadAsync((uint)size);
reader.ReadBytes(buffer);
最後のreader.ReadBytesでbyte配列に画像データが書き込まれます。
コメントでも書きましたが、書く順番によって以下のようなエラーが出ることがあります。
今回はその回避として、ファイルのサイズを変数に格納して後で使っています。
// 変数で保持するほどではないが、途中でSizeプロパティにアクセスするとエラーが出たので回避策 var size = read_stream.Size;
続いてファイルの書き込みです。
StorageFolder、StrageFileクラスを用いてファイルを保存するディレクトリを設定します。
StorageFolder folder = KnownFolders.DocumentsLibrary;
StorageFile outfile = await folder.CreateFileAsync("test.JPG", CreationCollisionOption.GenerateUniqueName);
ここではマイドキュメントにtest.JPGというファイルを作成しています。
ただしこのままだと、
WinRT 情報: 指定された場所 (DocumentsLibrary) にアクセスするには、アプリケーション マニフェストでファイルの種類の関連付けを宣言する必要があります。
というエラーが表示されます。
ファイルの種類の関連付けはPackage.appxmanifestで設定します。
上記写真のように拡張子を登録してあげます。
続いて書き込み処理を行います。
読み込んだバイト配列を書き込んであげます。
StorageFolder folder = KnownFolders.DocumentsLibrary;
StorageFile outfile = await folder.CreateFileAsync("test.JPG", CreationCollisionOption.GenerateUniqueName);
var out_stream = await outfile.OpenAsync(FileAccessMode.ReadWrite);
DataWriter dataWriter = new DataWriter(out_stream.GetOutputStreamAt(0));
dataWriter.WriteBytes(buffer);
await dataWriter.StoreAsync();
await dataWriter.FlushAsync();
dataWriter.DetachStream();
これでファイルが保存されました。
Please give us your valuable comment