バイナリファイルの入出力

バイナリファイルの入出力について解説します。

バイナリファイルの保存

バイナリファイルをPickerにより選択し、以下のようにして保存します。

private async void button_Click(object sender, RoutedEventArgs e)
{
    byte[] data = { 0, 1, 2, 3 };

    Windows.Storage.Pickers.FileSavePicker picker = new Windows.Storage.Pickers.FileSavePicker();
    picker.FileTypeChoices.Add("Xファイル", new List<string> { ".x" });
    Windows.Storage.StorageFile file = await picker.PickSaveFileAsync();
    if(file==null)return;

    await Windows.Storage.FileIO.WriteBufferAsync(file, data.AsBuffer());
}

 

バイナリファイルをストリームで保存する

バイナリファイルをいきなり全て保存すると、メモリを多く消費してしまいます。小さいファイルならいいのですが、ファイルが大きいと、メモリに入りきらない場合があります。そのような場合にはバイナリファイルをストリームで保存していきます。

private async void button_Click(object sender, RoutedEventArgs e)
{
    byte[] data = { 0, 1, 2, 3 };
    byte[] data2 = { 4, 5, 6, 7 };

    Windows.Storage.Pickers.FileSavePicker picker = new Windows.Storage.Pickers.FileSavePicker();
    picker.FileTypeChoices.Add("Xファイル", new List<string> { ".x" });
    Windows.Storage.StorageFile file = await picker.PickSaveFileAsync();
    if (file == null) return;

    IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
    await stream.WriteAsync(data.AsBuffer());
    await stream.WriteAsync(data2.AsBuffer());
}

 

バイナリファイルの読み込み

ピッカーでファイルを選択し、バイナリデータを読み込むには以下のようにします。

private async void button_Click(object sender, RoutedEventArgs e)
{
    Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.FileTypeFilter.Add(".x");
    Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
    if(file==null)return;

    IBuffer buf = await Windows.Storage.FileIO.ReadBufferAsync(file);
    byte[] data = new byte[buf.Length];
    using (DataReader reader = DataReader.FromBuffer(buf))
    {
        reader.ReadBytes(data);
    }
}

IBufferに読み込み、IBufferからbyte配列に変換します。

ランダムアクセスでバイナリファイルを読み込み

バイナリファイルの頭から読むのではなく途中から一部だけを読みたい場合があります。そのようなときにランダムアクセスを使用します。以下のようにすると、選択したXファイルから、2バイト目を1バイト読むことができます。

private async void button_Click(object sender, RoutedEventArgs e)
{
    Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.FileTypeFilter.Add(".x");
    Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
    if(file==null)return;

    IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
    stream.Seek(2);
    byte[] data = new byte[4];
    await stream.ReadAsync(data.AsBuffer(), 1, InputStreamOptions.None);
}

実行し、前に作ったXファイルを読むと(0,1,2,3の情報が入ったバイナリファイル)、data=[2,0,0,0]になります。

著者:安井 真人(やすい まさと)