プログラミング言語 C Shape C# ファイルの読み取りと書き込み

C# ファイルの読み取りと書き込み

 
ファイルは、ディスク上に保存された特定の名前とディレクトリ パスを持つデータのコレクションです。プログラムを使用してファイルの読み取りまたは書き込みを行うと、プログラムはファイルをデータ ストリーム (略してストリーム) の形式でメモリに読み取ります。 )。ストリームは通信パスを通過する一連のバイトと考えることができます。ストリームは主に入力ストリームと出力ストリームに分けられます。入力ストリームは主にファイルからデータを読み取る (読み取り操作) ために使用され、出力ストリームは主にファイルへの書き込み、入力データ (書き込み操作) に使用されます。

 

C# の I/O クラス

System.IO 名前空間には、ファイルの作成、削除、読み取り、書き込みなどのファイル操作のためのさまざまなクラスが含まれています。以下の表に示すように:

I/Oクラス 説明
BinaryReader バイナリストリームから生データを読み取る
BinaryWriter 生データをバイナリ形式で書き込む
BuferedStream バイトストリームの一時ストレージ
Directory ディレクトリのコピー、移動、名前変更、作成、削除
DirectoryInfo ディレクトリに対する操作を実行するために使用されます
DriveInfo ドライブ情報を取得する
File ファイルを操作する
FileInfo ファイルに対する操作を実行するため
FileStream ファイル内の任意の場所での読み取りおよび書き込み用
MemoryStream メモリに保存されているデータのストリームへのランダム アクセス用
Path パス情報に対する操作を実行する
StreamReader バイトストリームから文字を読み取るために使用されます
StreamWriter ストリームに文字を書き込むために使用されます
StringReader 文字列バッファからデータを読み取るために使用されます
StringWriter 文字列バッファにデータを書き込むために使用されます

FileStream クラス

System.IO 名前空間の FileStream クラス。これを使用して、ファイルの読み取り、書き込み、およびクローズを行います。 FileStream クラス オブジェクトを作成するための構文は次のとおりです。

FileStream <object_name> = new FileStream(<file_name>, <FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);

パラメータは次のように説明されます。

  • object_name: 作成されたオブジェクトの名前。
  • file_name: ファイルのパス (ファイル名を含む);
  • FileMode: 列挙型。ファイルの開くモードを設定するために使用されます。オプションの値は次のとおりです。
    • 追加: 既存のファイルを開き、ファイルの末尾にカーソルを置きます。ファイルが存在しない場合は作成します。
    • 作成: 新しいファイルを作成します。ファイルがすでに存在する場合は、古いファイルを削除してから、新しいファイルを作成します。
    • CreateNew: 新しいファイルを作成します。ファイルがすでに存在する場合は、例外がスローされます。
    • 開く: 既存のファイルを開きます。ファイルが存在しない場合は、例外がスローされます。
    • OpenOrCreate: 既存のファイルを開きます。ファイルが存在しない場合は、新しいファイルを作成して開きます。
    • 切り詰め: 既存のファイルを開いてからファイルをクリアし (元のコンテンツを削除し)、ファイルが存在しない場合は例外をスローします。
  • FileAccess: 列挙型。ファイル アクセスの設定に使用されます。オプションの値は Read、ReadWrite、Write です。
  • FileShare: 列挙型。ファイルのアクセス許可を設定するために使用されます。オプションの値は次のとおりです。
    • 継承可能: 子プロセスがファイル ハンドルを継承できるようにします。Win32 はこの機能を直接サポートしていません。
    • なし: ファイルが閉じられるまで現在のファイルの共有を拒否し、(このプロセスまたは別のプロセスによる) ファイルを開く要求は失敗します。
    • 読み取り: ファイルを読み取りのために開くことを許可します。このフラグが指定されていない場合、ファイルを閉じる前に読み取りのためにファイルを開くリクエストはすべて失敗します。このフラグが指定されている場合でも、追加のアクセス許可は引き続き有効であることに注意してください。必須。ファイルにアクセスできること。
    • ReadWrite: 読み取りまたは書き込みのためにファイルを開くことを許可します。このフラグが指定されていない場合、ファイルを閉じる前に読み取りまたは書き込みのためにファイルを開くリクエストは失敗します。このフラグが指定されている場合でも、ファイルにアクセスするには追加の権限が必要です。
    • 書き込み: ファイルを書き込みのために開くことを許可します。このフラグが指定されていない場合、ファイルを閉じるまで書き込みのためにファイルを開くリクエストは失敗します。このフラグが指定されている場合でも、追加のアクセス許可が依然として存在する可能性があることに注意してください。ファイルにアクセスできる必要があります。
    • 削除: ファイルのその後の削除を許可します。

たとえば、sample.txt という名前のファイルを読み取るための FileStream オブジェクト F を作成します。サンプル コードは次のとおりです。

FileStream F = new FileStream(“sample.txt”, FileMode.Open, FileAccess.Read, FileShare.Read);

FileStream クラスの一般的なメソッドは次のとおりです。

方法 説明
Close() 現在のストリームを閉じ、それに関連付けられているすべてのリソース (ソケットやファイル ハンドルなど) を解放します。
CopyTo(Stream) 現在のストリームからバイトを読み取り、別のストリームに書き込みます
Dispose() ストリームで使用されているすべてのリソースを解放します
Equals(Object) 指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します
Finalize() FileStream が再利用されるときに、ガベージ コレクターがリソースを解放し、他のクリーンアップ操作を実行するようにします。
Flush() このストリームのバッファをクリアし、バッファされたすべてのデータをファイルに書き込みます。
GetHashCode() デフォルトのハッシュ関数
GetType() 現在のインスタンスのタイプを取得します
Lock(Int64, Int64) 他のプロセスが FileStream に対して読み書きできないようにする
Read(Byte[], Int32, Int32) ストリームからバイトのチャンクを読み取り、そのデータを指定されたバッファに書き込みます
ReadByte() ファイルから 1 バイトを読み取り、読み取り位置を 1 バイト進めます
ToString() 現在のオブジェクトを表す文字列を返します。
Unlock(Int64, Int64) 以前にロックされたファイルの全部または一部に他のプロセスがアクセスできるようにする
Write(Byte[], Int32, Int32) バイトのチャンクをファイル ストリームに書き込む
WriteByte(Byte) ファイルストリーム内の現在位置にバイトを書き込みます

[例] FileStream クラスを使用して、指定されたファイルを読み込みます。

 using System;
using System.IO;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            FileStream file = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

            for(int i = 0; i < 20; i++){
                file.WriteByte((byte)i);
            }
            file.Position = 0;

            for(int i = 0; i < 20; i++){
                Console.Write(file.ReadByte() + " ");
            }
            file.Close();
            Console.ReadKey();
        }
    }
} 

操作の結果は次のようになります。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

C# 日本語言語ファイルの読み書き

System.IO 名前空間の StreamReader クラスと StreamWriter クラスは、テキスト ファイルのデータの読み取りと書き込みに使用できます。これらのクラスは、ファイル ストリームの読み取りと書き込みのための関数を提供する抽象基本クラス Stream を継承します。

1) ストリームリーダー

StreamReader クラスは、抽象基本クラス TextReader を継承し、ファイルから一連の文字を読み取るために使用されます。次の表に、StreamReader クラスで一般的に使用されるいくつかのメソッドを示します。

方法 説明
public override void Close() StreamReader オブジェクトと基礎となるストリームを閉じ、それに関連付けられているシステム リソースを解放します。
public override int Peek() 次に使用可能な文字を返しますが、それは使用されません
public override int Read() 入力ストリームから次の文字を読み取り、文字位置を 1 文字分進めます。

メソッドの完全なリストを参照したい場合は、 C# の公式 Web サイトのドキュメントにアクセスしてください。

[例] StreamReaderを使用して、指定されたファイルの内容を読み取る場合、ファイルの内容は次のようになります。

IT基礎
https://it-kiso.com/
C# チュートリアル

サンプルコードは次のとおりです。

 using System;
using System.IO;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            try{
                // StreamReaderクラスのオブジェクトを作成する
                StreamReader file = new StreamReader("test.txt");
                string line;

                // ファイルから内容を読む
                while((line = file.ReadLine()) != null){
                    Console.WriteLine(line);
                }
            }catch(Exception e){
                // エラーメッセージを表示する
                Console.WriteLine("ファイルを読み取れません");
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
    }
} 

上記のコードを実行してファイルの内容を出力します。

2) ストリームライター

StreamWriter クラスも抽象クラス TextWriter から継承しており、一連の文字をファイルに書き込むために使用されます。次の表に、StreamWriter クラスで一般的に使用されるいくつかのメソッドを示します。

方法 説明
public override void Close() 現在の StreamWriter オブジェクトと基になるストリームを閉じます
public override void Flush() すべてのバッファリングされたデータが基礎となるストリームに書き込まれるように、現在のバッファをすべてクリアします。
public virtual void Write(bool value) ブール値のテキスト表現をテキスト ストリームに書き込みます
public override void Write(char value) ストリームに文字を書き込みます
public virtual void Write(decimal value) 小数値のテキスト表現をテキスト ストリームに書き込みます
public virtual void Write(double value) 8 バイト浮動小数点値のテキスト表現をテキスト ストリームに書き込みます
public virtual void Write(int value) 4 バイトの符号付き整数のテキスト表現をテキスト ストリームに書き込みます
public override void Write(string value) テキストストリームに文字列を書き込む
public virtual void WriteLine() テキストストリームに行末文字を書き込む

メソッドの完全なリストについては、 C# の公式ドキュメントを参照してください。

【例】 指定した内容をファイルに書き込みます。

 using System;
using System.IO;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            // ファイルに書き込むデータ
            string[] str = new string[]{
                "IT基礎",
                "https://it-kiso.com/",
                "C# チュートリアル"
            };
            // StreamWriterクラスのオブジェクトを作成
            StreamWriter file = new StreamWriter("demo.txt");
            // 配列のデータをファイルに書き込む
            foreach(string s in str){
                file.WriteLine(s);
            }
            file.Close();
            // ファイルからの読み取り
            string line = "";
            StreamReader readfile = new StreamReader("demo.txt");
            while((line = readfile.ReadLine()) != null){
                Console.WriteLine(line);
            }
            readfile.Close();
            Console.ReadKey();
        }
    }
} 

操作の結果は次のようになります。

IT基礎
https://it-kiso.com/
C# チュートリアル

バイナリファイルの読み書き

C# の BinaryReader クラスと BinaryWriter クラスは、バイナリ ファイルの読み取りと書き込みに使用できます。

1) BinaryReader クラス

BinaryReader クラスは、ファイルからバイナリ データを読み取るために使用されます。クラス内の一般的なメソッドは次のとおりです。

方法 説明
public override void Close() BinaryReader オブジェクトと基礎となるストリームを閉じます
public virtual int Read() 基になるストリームから文字を読み取り、使用されるエンコーディングとストリームから読み取られた特定の文字に基づいてストリームの現在位置を進めます。
public virtual bool ReadBoolean() 現在のストリームからブール値を読み取り、ストリームの現在位置を 1 バイト進めます。
public virtual byte ReadByte() 現在のストリームから次のバイトを読み取り、ストリームの現在位置を 1 バイト進めます
public virtual byte[] ReadBytes(int count) 現在のストリームから指定されたバイト数をバイト配列に読み取り、指定されたバイト数だけストリームの現在位置を進めます。
public virtual char ReadChar() 現在のストリームから次のバイトを読み取り、使用されているエンコーディングとストリームから読み取られた指定された文字によってストリームの現在位置を進めます。
public virtual char[] ReadChars(int count) 現在のストリームから指定された数の文字を読み取り、文字配列の形式でデータを返し、使用されているエンコーディングとストリームから読み取られた指定された文字に従って、ストリームの現在位置を前方に移動します。
public virtual double ReadDouble() 現在のストリームから 8 バイトの浮動小数点値を読み取り、ストリームの現在位置を 8 バイト進めます。
public virtual int ReadInt32() 現在のストリームから 4 バイトの符号付き整数を読み取り、ストリームの現在位置を 4 バイト進めます
public virtual string ReadString() 現在のストリームから文字列を読み取ります。文字列には長さが接頭辞として付けられ、7 ビット整数としてエンコードされます。

メソッドの完全なリストについては、 C# の公式ドキュメントを参照してください。

2) BinaryWriter クラス

BinaryWriter クラスはバイナリ データをファイルに書き込むために使用されます。クラス内の一般的なメソッドを次の表に示します。

方法 説明
public override void Close() BinaryWriter オブジェクトと基礎となるストリームを閉じます
public virtual void Flush() 現在のライターのすべてのバッファをクリアし、バッファされたすべてのデータを基礎となるデバイスに書き込みます。
public virtual long Seek(int offset,SeekOrigin origin) 現在のストリーム内の位置を設定する
public virtual void Write(bool value) 現在のストリームにブール値のバイトを書き込みます。0 は false を意味し、1 は true を意味します
public virtual void Write(byte value) 現在のストリームに符号なしバイトを書き込み、ストリームの位置を 1 バイト進めます
public virtual void Write(byte[] buffer) バイト配列を基礎となるストリームに書き込みます
public virtual void Write(char ch) Unicode 文字を現在のストリームに書き込み、使用されるエンコーディングとストリームに書き込まれる指定された文字に従ってストリームの現在位置を進めます。
public virtual void Write(char[] chars) 文字の配列を現在のストリームに書き込み、使用されるエンコーディングとストリームに書き込まれる指定された文字に従ってストリームの現在位置を進めます。
public virtual void Write(double value) 8 バイトの浮動小数点値を現在のストリームに書き込み、ストリームの位置を 8 バイト進めます。
public virtual void Write(int value) 4 バイトの符号付き整数を現在のストリームに書き込み、ストリームの位置を 4 バイト進めます
public virtual void Write(string value) BinaryWriter の現在のエンコーディングで長さのプレフィックス付き文字列をストリームに書き込み、使用されるエンコーディングとストリームに書き込まれる指定された文字に従ってストリームの現在位置を進めます。

メソッドの完全なリストについては、 C# の公式ドキュメントを参照してください。

[例] 以下の例は、バイナリ ファイルの読み書きを示します。

 using System;
using System.IO;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            BinaryWriter bw;
            BinaryReader br;
            int i = 25;
            double d = 3.14157;
            bool b = true;
            string s = "IT基礎";
            // ファイルの作成
            try{
                bw = new BinaryWriter(new FileStream("mydata", FileMode.Create));
            }catch (IOException e){
                Console.WriteLine(e.Message + "\n ファイルの作成に失敗しました!");
                return;
            }
            // ファイルへの書き込み
            try{
                bw.Write(i);
                bw.Write(d);
                bw.Write(b);
                bw.Write(s);
            }catch (IOException e){
                Console.WriteLine(e.Message + "\n ファイルへの書き込みに失敗しました!");
            }
            bw.Close();

            // ファイルの読み込み
            try{
                br = new BinaryReader(new FileStream("mydata", FileMode.Open));
            }catch (IOException e){
                Console.WriteLine(e.Message + "\n ファイルのオープンに失敗しました!");
                return;
            }
            try{
                i = br.ReadInt32();
                Console.WriteLine("Integer data: {0}", i);
                d = br.ReadDouble();
                Console.WriteLine("Double data: {0}", d);
                b = br.ReadBoolean();
                Console.WriteLine("Boolean data: {0}", b);
                s = br.ReadString();
                Console.WriteLine("String data: {0}", s);
            }catch (IOException e){
                Console.WriteLine(e.Message + "\n ファイルの読み込みに失敗しました!.");
            }
            br.Close();
            Console.ReadKey();
        }
    }
} 

操作の結果は次のようになります。

Integer data: 25
Double data: 3.14157
Boolean data: True
String data: IT基礎

「C# ファイルの読み取りと書き込み」についてわかりやすく解説!絶対に観るべきベスト2動画

【メモ帳作成講座(C#)】第2回 ファイルの読み込みと書き込み【独り言】