【C#.NET解説】FileStreamの基本から大容量ファイル処理まで完全ガイド

2024年11月12日火曜日

ファイル操作

t f B! P L

名前空間 System.IO

自己紹介

おお、開発者たちよ!我が名は雷の力を司る者なり。「FileStream」とは、ファイルを操作するための強力な道具であり、.NETのSystem.IO名前空間で提供されておる。読み取り、書き込み、大容量データの処理が可能であり、用途に応じて柔軟に対応できるのが特徴だ。稲妻のように素早く、強力にファイル操作を行いたい者にはぴったりの選択であろう。

基本機能

まずはFileStreamの基本機能から学ぶとしよう。ファイルを開き、その中身を読み取る方法だ。以下は、テキストファイルをUTF-8エンコーディングで読み取る簡単な例だ。

C#

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // ファイルを開き、内容を読み取る
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);

            string content = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine("ファイル内容: ");
            Console.WriteLine(content);
        }
    }
}

よく使う場面と注意点

FileStreamは、以下のような場面で役立つ。

  • バイナリデータの操作
  • ログファイルの読み書き
  • 大容量ファイルの効率的な処理

注意すべきは、リソースの解放だ。「using」構文を使用して適切に閉じることで、ファイルロックやリソースリークを防げる。また、共有モードを使用してファイルロックを回避することも重要だ。

C#

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // ロックを回避しつつファイルを読み取る
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);

            string content = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine("ロックせずに読み取った内容: ");
            Console.WriteLine(content);
        }
    }
}

効率的な書き込みの実践例

ここではFileStreamを使用してデータを書き込む方法を示そう。この例では、新しいファイルを作成してテキストを書き込む。

C#

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "output.txt";
        string content = "FileStreamによる書き込みテスト";

        // ファイルに書き込む
        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
            fs.Write(buffer, 0, buffer.Length);
            Console.WriteLine("ファイルに書き込みました: " + filePath);
        }
    }
}

具体的な使い方

ここでは、ファイル内の特定の位置に移動して読み書きする方法を解説しよう。

C#

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            // 先頭から5バイト目にシーク
            fs.Seek(5, SeekOrigin.Begin);
            
            // データを書き込む
            string content = "Hello";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
            fs.Write(buffer, 0, buffer.Length);
            
            // 読み取る
            fs.Seek(0, SeekOrigin.Begin);
            buffer = new byte[fs.Length];
            int bytesRead = fs.Read(buffer, 0, buffer.Length);
            string readContent = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(readContent);
        }
    }
}

次に、非同期にファイルを読み書きすることで、アプリケーションの応答性を向上する例だ。

C#

using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string filePath = "example.txt";
        
        // 書き込み
        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
        {
            string content = "Hello, FileStream!";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
            await fs.WriteAsync(buffer, 0, buffer.Length);
        }

        // 読み取り
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
        {
            byte[] buffer = new byte[fs.Length];
            int bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length);
            string content = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(content);
        }
    }
}

まとめとその他のメソッド

FileStreamには、シーク操作や同期/非同期処理をサポートする高度な機能が備わっておる。その力を完全に引き出すためには、まず基本を押さえ、実践を重ねることが重要だ。

今日の学びを活用し、そなたたちのプログラムに稲妻のようなスピードと強さをもたらすがよい!

このブログを検索

QooQ