- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-05-06T09:47:36+09:00","","")
#author("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)
* 動作確認環境 [#nb31c58d]
-Windows 10 ver.1909
-Visual Studio 2019
-.NET Core
-コンソールアプリケーション
* Fileクラスを使ったファイル操作サンプルコード [#i2b01457]
以下のサンプルコードは以下の動作になります。
+ ファイルがあれば、追記モードでファイルを開きます。~
ファイルが無ければ新規に作成します。
+ バイナリー値を0から0から10まで書き込みます。
+ 作成(追記)したファイルを開き、読込し値を表示します。
** C# [#a0de0861]
#ref(\Program.cs)
#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)
#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)