C#でテキストファイルを読んでみた (File.ReadAllText編)

C#のWPFで、テキストファイルを読み込んで文字列型変数に格納してみました。いくつか方法があると思いますが、MSDNで紹介されているReadAllTextメソッドを使ってみました。ファイルの文字コードが分っている場合には、便利な方法です。 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop

目次

  1. シナリオ
  2. ReadAllTextメソッド
  3. 試してみた
    1. XAML
    2. コード
    3. 試してみた

シナリオ

  1. FileクラスのReadAllTextメソッドに、ファイルのパスを渡して読み込みます。

これだけ。ファイルのオープンとクローズを意識しなくて良いのが楽です。

ReadAllTextメソッド

ReadAllTextメソッドは、ファイルを開いて、最初から最後まで読み込み、ファイルを閉じるメソッドです。ファイルにアクセスできない場合などには、状況に応じた例外を投げてくれます。

string text = File.ReadAllText(path, enc);

引数

説明

path

string

ファイル名を指定します。

enc

Encoding

文字コードを指定します。省略できます。省略するとUTF-8で読みます。

戻り値は、string型の文字列です。

試してみた

テキストファイルを読んで、結果をTextBlockに表示するアプリを作ってみます。読み込むファイル名は、TextBoxにドロップすることで取得するようにします。残念ながらこのメソッドには日本語の文字コードを自動判別したりするような機能はありませんので、RadioButtonで予め文字コードを選択してもらうようにします。

XAML

まずはXAMLです。

<Window x:Class="read_textfile_trial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:read_textfile_trial"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <StackPanel>
            <TextBox Name="textbox" Text="ファイルをドロップしてください。" AllowDrop="True" Margin="5" />
            <StackPanel Name="panelCode" Orientation="Horizontal">
                <RadioButton Tag="shift_jis" Content="Shift JIS" IsChecked="True" Margin="5" />
                <RadioButton Tag="euc-jp" Content="EUC" Margin="5" />
                <RadioButton Tag="utf-8" Content="UTF-8" Margin="5" />
            </StackPanel>
            <Button Name="button" Content="読み込み" Click="button_Click" Margin="5"/>
            <TextBlock Name="textblock" Height="100" Margin="5" />
        </StackPanel>
    </Grid>
</Window>

特別なことはしていません。ファイル名取得用のTextBoxのAllowDropプロパティをTrueに設定していることと、RadioButtonをグループにしているStackPanelにNameプロパティを設定した程度です。RadioButtonのTagプロパティに設定した文字列は、Encoding.GetEncodingメソッドに渡す文字列を設定しました。

コード

using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.IO;

namespace read_textfile_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // ドラッグアンドドロップ用のイベントハンドラを追加する。
            textbox.AddHandler(TextBox.DragOverEvent, new DragEventHandler(textbox_DragOver), true);
            textbox.AddHandler(TextBox.DropEvent, new DragEventHandler(textbox_Drop), true);
        }

        private void textbox_DragOver(object sender, DragEventArgs e)
        {
            // マウスポインタを変更する。
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effects = DragDropEffects.All;
            }
            else
            {
                e.Effects = DragDropEffects.None;
            }
            e.Handled = false;
        }

        private void textbox_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop); // ドロップしたファイル名を全部取得する。
                textbox.Text = filenames[0]; // 最初のファイル名をテキストボックスに表示する。
            }
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // 文字コードの選択内容を取得する。
            Encoding enc = Encoding.GetEncoding("shift_jis");
            foreach (RadioButton radioCode in panelCode.Children)
            {
                if ((bool)radioCode.IsChecked)
                {
                    enc = Encoding.GetEncoding(radioCode.Tag.ToString());
                    break;
                }
            }

            // テキストファイル読み込み。
            try
            {
                string readtext = File.ReadAllText(textbox.Text, enc);
                textblock.Text = readtext;
            } catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

FileクラスはSystem.IO名前空間のクラスなので、using句でSystem.IO名前空間への参照を追加しました。 ドラッグアンドドロップ関係のコード部分の説明は省きます。 button_Click()メソッドでファイルの読み込みの処理をします。Encodingクラスのインスタンス enc に、Encoding.GetEncodingメソッドで文字エンコードを設定します。それをファイルパスとともにReadAllTextメソッドに渡して、ファイルを読み込みします。

試してみた

TeraPadで下記の4種類のテキストファイルを作って、読んでみます。

  • 文字コードがShift JISで、改行コードがCR+LF。Windows環境に多いタイプ。

  • 文字コードがEUC-JPで、改行コードがCR。昔のマッキントッシュってこんな感じでしたっけ?

  • 文字コードがUTF-8(BOM無)で、改行コードがLF。Androidではこれが多いのではないかと思います。

  • 文字コードがUTF-8(BOM有)で、改行コードがLF。

160813-6-01 160813-6-02 160813-6-03 160813-6-04 そういえば、iOSってどうなってるんでしょうか。 試しにファイル名を空にしてボタンをクリックすると、下図のようなエラーメッセージを表示します。 160813-6-05 Shift JISのファイルを読んでみました。 160813-6-06 EUCのファイルを読んでみました。 160813-6-07 UTF-8(BOM無)のファイルを読んでみました。 160813-6-08 UTF-8(BOM有)のファイルを読んでみました。 160813-6-09 Encodingにutf-8を指定すると、BOMの有無を関係無しに読んでくれるようです。 Android端末で文字入力したり、WindowsでもSphinx(Shift JIS非対応)を使ったりする関係で、Shift JISとUTF-8のテキストファイルが混じってたりする私としては、自動で判別してくれるとありがたいのですが。

公開日

広告