#author("2020-05-09T15:01:16+09:00;2020-05-06T09:49:12+09:00","","")
#author("2020-05-09T15:01:58+09:00;2020-05-06T09:49:12+09:00","","")
#navi(../)
* バイナリーファイルの作成・リード・ライト(バイト単位の読み書き) [#wdde2dff]
バイト単位で読込したい、書き込みしたい、ファイルを作成したい場合は、FileStreamクラスを使うと実現できます。~
尚、Fileクラスで一気にByte配列として読み込むメソッドがありますので、リードの場合は File.ReadAllBytes が便利かもしれませんね。~
以下に、FileStream クラスを使った C#, Visual Basic のサンプルコードと実行例を記します。

#contents

* 関連サイト [#m79cc831]
-[[Microsoft .NET | FileStream クラス>https://docs.microsoft.com/ja-jp/dotnet/api/system.io.filestream]]
-[[Microsoft .NET | FileMode 列挙型>https://docs.microsoft.com/ja-jp/dotnet/api/system.io.filemode]]
-[[Microsoft .NET | FileAccess 列挙型>https://docs.microsoft.com/ja-jp/dotnet/api/system.io.fileaccess]]

#htmlinsert(windev-top.html)

* 関連記事 [#hf3305ac]
-[[バイナリファイルをバイト配列にすべてを読み込む・File.ReadAllBytes>.NET/バイト配列にファイルの内容をすべて読み込む]]

#htmlinsert(windev-top.html)


* 動作確認環境 [#nb31c58d]
-Windows 10 ver.1909
-Visual Studio 2019
-.NET Core
-コンソールアプリケーション
 
* Fileクラスを使ったファイル操作サンプルコード [#i2b01457]
以下のサンプルコードは以下の動作になります。
+ ファイルがあれば、追記モードでファイルを開きます。~
ファイルが無ければ新規に作成します。
+ バイナリー値を0から0から10まで書き込みます。
+ 作成(追記)したファイルを開き、読込し値を表示します。

** C# [#a0de0861]
#ref(Program.cs)
 using System;
 using System.IO;
 
 class Program
 {
     static void Main(string[] args)
     {
         string desktopPath = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
         string filename = System.IO.Path.Combine(desktopPath, "test.dat");
 
         try
         {
             // File Open(or Create) and Append mode
             using (var fs = File.Open(filename, FileMode.Append, FileAccess.Write))
             {
                 for (int i = 1; i <= 10; i++)
                     fs.WriteByte((byte)i);
             }
 
             // File Read and stdout
             using (var fs = File.Open(filename, FileMode.Open, FileAccess.Read))
             {
                 long i = 0L;
                 while (i < fs.Length)
                 {
                     Console.WriteLine("{0}: {1}", i, fs.ReadByte());
                     i += 1;
                 }
             }
         }
         catch (Exception ex)
         {
             Console.Error.WriteLine("Exception: " + ex.ToString());
         }
     }
 }



** Visual Basic [#o3391fc7]
#ref(Program.vb)
 Imports System
 Imports System.IO
 
 Module Program
     Sub Main(args As String())
 
         Dim desktopPath As String = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
         Dim filename As String = System.IO.Path.Combine(desktopPath, "test.dat")
 
         Try
             'File Open(or Create) and Append mode
             Using fs = File.Open(filename, FileMode.Append, FileAccess.Write)
                 For i As Integer = 1 To 10
                     fs.WriteByte(CByte(i))
                 Next
             End Using
 
             'File Read and stdout
             Using fs = File.Open(filename, FileMode.Open, FileAccess.Read)
                 Dim i As Long = 0L
                 While i < fs.Length
                     Console.WriteLine("{0}: {1}", i, fs.ReadByte)
                     i += 1
                 End While
             End Using
 
         Catch ex As Exception
             Console.Error.WriteLine("Exception: " & ex.ToString)
         End Try
 
     End Sub
 End Module

** 実行結果 [#k532b382]
上記サンプルコードを2回起動しています。~
2回目で追記されていることが確認できます。
#ref(run.png)
#br
また、ファイル内容を PowerShellの Format-Hex コマンドレットを使って16進数表示した結果です。
#ref(run2.png)

以上、Fileクラスの ReadByte, WriteByte を使ってバイト値のバイナリーファイルの読み書きでした。

#htmlinsert(windev-btm.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS