C#でテキストファイルを読んでみた (File.ReadAllText編)
C#のWPFで、テキストファイルを読み込んで文字列型変数に格納してみました。いくつか方法があると思いますが、MSDNで紹介されているReadAllTextメソッドを使ってみました。ファイルの文字コードが分っている場合には、便利な方法です。 試した環境は下記です。
Visual Studio 2015 Express for Windows Desktop
目次
シナリオ
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。
そういえば、iOSってどうなってるんでしょうか。 試しにファイル名を空にしてボタンをクリックすると、下図のようなエラーメッセージを表示します。 Shift JISのファイルを読んでみました。 EUCのファイルを読んでみました。 UTF-8(BOM無)のファイルを読んでみました。 UTF-8(BOM有)のファイルを読んでみました。 Encodingにutf-8を指定すると、BOMの有無を関係無しに読んでくれるようです。 Android端末で文字入力したり、WindowsでもSphinx(Shift JIS非対応)を使ったりする関係で、Shift JISとUTF-8のテキストファイルが混じってたりする私としては、自動で判別してくれるとありがたいのですが。
公開日
広告
C#の入出力カテゴリの投稿
- C#でCSVファイルを読み込んでコレクションに入れてみた
- C#でInputBoxを使ってみた
- C#で「名前を付けて保存」ダイアログを使ってみた
- C#でクリップボードから文字列を取得する
- C#でクリップボードにデータを入れる
- C#でコマンドライン引数を取得する
- C#でテキストファイルを読んでみた (File.ReadAllText編)
- C#でドロップされたファイルの名前を得る(WPF編 DragOver版)
- C#でドロップされたファイルの名前を得る(WPF編 PreviewDragOver版)
- C#でドロップされたファイルの名前を得る(Windowフォーム編)
- C#でパイプを使ってデータを入力してみる
- C#でメッセージボックスを使う