#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)