MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの基礎 - ファイルのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの基礎 - ファイル
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== バイナリファイル == ==== バイナリファイルの読み込みと書き込み ==== ファイルの内容をすべてbyte配列に読み込む、または、byte配列全体をファイルに書き込む場合、<br> Fileクラス(System.IO名前空間)のReadAllBytesメソッドおよびWriteAllBytesメソッドを使用する。<br> これらのメソッド(静的)では、ファイルを開く、byte配列への読み込みまたはbyte配列の書き込み、ファイルを閉じるという3つの処理を<br> ReadAllBytesメソッドで実行可能である。<br> ReadAllBytesメソッドは、読み込むファイルのパス名をパラメータに指定して呼ぶと、戻り値としてファイルの内容を読み込んだbyte配列を返す。<br> また、WriteAllBytesメソッドでは、書き込むファイルのパス名(ファイルが存在する場合は上書き)と書き込むbyte配列をパラメータで指定する。<br> 尚、WriteAllBytesメソッドの戻り値はない。<br> <source lang="cpp"> byte[] data = File.ReadAllBytes(@"hoge.bin"); // 読み込み File.WriteAllBytes(@"newhoge.bin", data); // 書き込み </source> <br> ==== サンプルコード(バイナリファイルを固定サイズで分割する) ==== 次のサンプルコードは、ReadAllBytesメソッドとWriteAllBytesメソッドを使用したサンプルコードである。<br> このプログラムでは、バイナリファイルを読み込み、それを固定サイズ(サイズ : 1[MB])の複数ファイルに分割して出力する。<br> 尚、出力する最後のファイルは固定サイズに満たない場合がある。<br> <syntaxhighlight lang="C#"> using System; using System.IO; class BinarySplit { static void Main() { // バイナリファイルの読み込み byte[] src = File.ReadAllBytes(@"hoge.bin"); int FILESIZE = 1024 * 1024; // 分割サイズ int num = 0; for (int remain = src.Length; remain > 0; remain -= FILESIZE) { int length = Math.Min(FILESIZE, remain); // 作成する分割ファイルの実際のサイズ byte[] dest = new byte[length]; // 分割ファイルへ書き出すbyte配列の作成 Array.Copy(src, num * FILESIZE, dest, 0, length); // 出力ファイル名(out0001.bin、out0002.bin、……) string name = String.Format("out{0:D4}.bin", num + 1); // byte配列のファイルへの書き込み File.WriteAllBytes(name, dest); num++; } } } </syntaxhighlight> <br> ReadAllBytesメソッドは、ファイル全体を一度に読み込むため、巨大なファイルを扱う場合には、<br> 読み込みに掛かる時間や使用するメモリ量について注意が必要である。<br> <br> ==== サンプルコード(非同期でバイナリファイルを読み書きする) ==== バイナリファイルへ書き込んだ後、それを読み込むサンプルコードに示す。<br> この例では、書き込み用に開くときにFileMode.Createを指定しているので上書きになる。(追記する場合 : FileMode.Append)<br> <syntaxhighlight lang="c#"> async Task BinaryReadWriteAsync(byte[] data) { const string FilePath = @".\sample.dat"; // 読み書きするファイル // バイナリファイルへ書き込み // ファイルを上書きモードで開く(ファイルが存在しない場合は作成) // 追加モードにするにはFileModeをAppendに変える using (var fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write)) { await fs.WriteAsync(data, 0, data.Length); // バイナリデータを非同期で書き込む } // バイナリファイル読み込み byte[] result; // データを格納する配列 // ファイルを読み取りモードで開く using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { result = new byte[fs.Length]; // データ格納用の配列を確保する // バイナリデータを非同期で読み込む await fs.ReadAsync(result, 0, (int)fs.Length); } // 読み込んだ内容をコンソールへ出力する for (int i=0; i < result.Length; i++) { Write($"{result[i]:X2} "); if (i % 16 == 7) { Write(" "); } else if (i % 16 == 15) { WriteLine(); } } WriteLine(); } </syntaxhighlight> <br><br> == テキストファイル == ==== テキストファイルの読み込みと書き込み ==== <code>StreamReader</code>クラスを使用して、<br> テキストファイルの読み込みと書き込み、<code>using</code>構文によるファイルのクローズ、例外処理等を記載する。<br> <br> テキストファイルの内容を読み込むには、以下の3つの処理からなる。<br> # ファイルを開く # ファイルの内容を読み込む # ファイルを閉じる <br> ==== テキストファイルを開く ==== ファイルを開くにはいくつかの方法が存在するが、UTF-8のファイルを開く場合、<br> <code>StreamReader</code>クラス(<code>System.IO</code>名前空間)を使用する。<br> <syntaxhighlight lang="c#"> StreamReader sr = new StreamReader(@"readme.txt", Encoding.UTF8); </syntaxhighlight> <br> また、Shift-JISのファイルを開く場合は、以下のように記述する。<br> <syntaxhighlight lang="c#"> StreamReader sr = new StreamReader(@"readme.txt", Encoding.GetEncoding("Shift_JIS")); </syntaxhighlight> <br> ==== テキストファイルを読み込む ==== <code>StreamReader</code>クラスの<code>ReadToEnd</code>メソッドを使用して、テキストファイルの内容を一括して読み込むことができる。<br> また、<code>ReadToEnd</code>メソッドでは、改行文字等も含めて、全ての1つの文字列として読み込まれる。<br> <br> ==== usingステートメントを使用してファイルを閉じる ==== <code>StreamReader</code>クラスは、<code>IDisposable</code>インタフェースを実装しているため、(スーパークラスの<code>TextReader</code>クラスが実装している)<br> <code>Close</code>メソッドの代わりに、<code>using</code>ステートメントを利用することもできる。<br> <br> <u><code>using</code>ステートメントを抜ける時、自動的に<code>StreamReader</code>クラスの<code>Dispose</code>メソッドを呼び出して、</u><br> <u>その中で<code>Close</code>メソッドが呼び出される。</u><br> <br> ==== ファイルが読み込めない時のエラー処理 ==== ファイルが存在しない場合やファイルの読み込み中にディスク等に何らかの障害が発生する場合、<br> 例外が発生してプログラムの実行が中断されるため、例外処理を記述する必要がある。<br> <br> ==== テキストファイルの一括読み込み(変数の使用) ==== 以下の例では、<code>ReadToEnd</code>メソッドを非同期処理に対応した<code>ReadToEndAsync</code>メソッドを使用して、<br> ファイルの全ての内容を一括して読み込んでいる。<br> <syntaxhighlight lang="c#"> using System; using System.IO; using System.Text; string text = string.Empty; try { using (StreamReader sr = new StreamReader(@"hoge.txt", Encoding.UTF8)) { text = await sr.ReadToEndAsync(); } Console.Write(text); } catch (Exception ex) { Console.WriteLine(ex.Message); } </syntaxhighlight> <br> ==== ファイルの内容を1行ずつ読み込む ==== ファイルの全ての内容を1つの変数に読み込むよりも、1行ずつ読み込んで文字列の配列に代入する方が扱いやすい場合がある。<br> <br> ファイルから1行読み込むには、<code>StreamReader</code>クラスの<code>ReadLine</code>メソッドを使用する。<br> <code>ReadLine</code>メソッドは、ファイルから1行のみ読み込み、内部で読み取り位置を1行分進める。<br> 読み取り位置がファイルの末尾に達した場合、<code>null</code>を返す。<br> <br> なお、.NET Framework 2.0以降では、<code>File</code>クラス(<code>System.IO</code>名前空間)において、<br> ファイルを開く・内容を読み込む・ファイルを閉じるという一連の処理を1つのメソッドで行う<code>ReadAllText</code>メソッドと<code>ReadAllLines</code>メソッドが追加されている。<br> <syntaxhighlight lang="c#"> using System; using System.IO; using System.Text; using System.Collections; string line = string.Empty; List<string> list = new List<string>(); try { using (StreamReader sr = new StreamReader(@"hoge.txt", Encoding.UTF8)) { while ((line = await sr.ReadLineAsync()) != null) { list.Add(line); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } foreach (string strLine in list) { Console.WriteLine(strLine); } </syntaxhighlight> <br> ==== テキストファイルの一括読み込み(変数の使用) ==== テキストファイルの全ての内容を1つの変数に読み込む場合、<code>File</code>クラスの<code>ReadAllText</code>メソッドを使用する。<br> <code>ReadAllText</code>メソッドで使用する標準の文字コードは、UTF-8である。<br> <br> 以下の例では、テキストファイルの内容を一括して変数に読み込んでいる。<br> <syntaxhighlight lang="c#"> using System.Text; using System.IO; try { // ファイルの読み込み string text1 = File.ReadAllText(@"hoge.txt", Encoding.UTF8); } catch (Exception ex) { Console.WriteLine(ex.Message); } </syntaxhighlight> <br> ==== テキストファイルの一括読み込み(配列の使用) ==== テキストを1行ずつ処理する場合、各行を要素とする文字列配列を使用する。<br> これは、<code>System.IO.File</code>クラスの<code>ReadAllLines</code>メソッドを使用して実行する。<br> <u><code>ReadAllLines</code>メソッドで使用する標準の文字コードは、UTF-8である。</u><br> <br> なお、<code>ReadAllLines</code>メソッドは、ファイル末尾の改行文字を無視する。<br> ファイル末尾に改行文字がある場合、<code>ReadAllLines</code>メソッドで得られる行数は1行少なくなる。<br> <br> 以下の例では、テキストファイルの内容を一括して配列に読み込んでいる。<br> <syntaxhighlight lang="c#"> using System.Text; using System.IO; try { // ファイルの読み込み string[] lines1 = File.ReadAllLines(@"hoge.txt", Encoding.UTF8); } catch (Exception ex) { Console.WriteLine(ex.Message); } </syntaxhighlight> <br><br> == CSVファイル == CSVファイルを読み込むには、.NET Framework 2.0で追加された<code>TextFieldParser</code>クラス(<code>Microsoft.VisualBasic.FileIO</code>名前空間)を使用する。<br> <code>TextFieldParser</code>クラスを使用することで、CSVファイルを読み込み、各行の各フィールドの文字列を簡潔に取得することができる。<br> <br> ==== CSVファイルを読み込む ==== <code>TextFieldParser</code>クラスを使用してCSVファイルを読み込むには、<br> まず、<code>TextFieldParser</code>クラスのコンストラクタに処理するCSVファイルを指定して、インスタンスを生成する。<br> CSVファイルに日本語が含まれている場合は、文字コードを指定する。<br> <syntaxhighlight lang="c#"> using System.Text; using Microsoft.VisualBasic.FileIO; var parser = new TextFieldParser(@"hoge.csv", Encoding.GetEncoding("Shift_JIS")); // 文字コードはShift-JISを指定する </syntaxhighlight> <br> 次に、<code>TextFieldType</code>プロパティに<code>FieldType.Delimited</code>を指定する。<br> もし、<code>FieldType.FixedWidth</code>を指定する場合、フィールドが固定幅のファイルも扱うことができる。<br> <br> また、<code>SetDelimiters</code>メソッドを使用して、区切り文字を指定する。(複数の区切り文字が指定可能)<br> CSVファイルの場合は、<code>,</code>(カンマ)を指定する。<br> <syntaxhighlight lang="c#"> parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); // 区切り文字はカンマを指定する </syntaxhighlight> <br> <code>TextFieldParser</code>クラスの<code>ReadFields</code>メソッドを実行するごとに、CSVファイルを1行ずつ読むことができる。<br> <code>ReadFields</code>メソッドは、読み込んだレコードの全てのフィールドを文字列配列に変換して返す。<br> 次のレコードが存在するかどうかは<code>EndOfData</code>プロパティにより判定できるため、ループにより、CSVファイル全体を処理できる。<br> <syntaxhighlight lang="c#"> while (!parser.EndOfData) { // 配列rowの要素は読み込んだレコードの各フィールドの値 string[] row = parser.ReadFields(); // 1レコード読み込む } </syntaxhighlight> <br> ==== CSVファイルを読み込み表示する ==== 以下の例では、hoge.csvファイルを読み込み、各フィールドを切り出してタブ区切りで画面に出力する。<br> 改行文字および空白文字がどのように処理されるかを分かりやすくするために、それぞれをnと_に置換して出力している。<br> <br> * <code>HasFieldsEnclosedInQuotes</code>プロパティ *: フィールドに改行やデリミタを含める為に引用符を使っているようなフォーマットを考慮する場合は、 *: <code>HasFieldsEnclosedInQuotes</code>プロパティを<code>true</code>に設定する。(初期値はtrue) * TrimWhiteSpaceプロパティ *: フィールドの前後の空白文字を削除しない場合は、<code>TrimWhiteSpace</code>プロパティを<code>false</code>に設定する。(初期値はtrue) <br> <syntaxhighlight lang="c#"> using System; using System.Text; using Microsoft.VisualBasic.FileIO; class CSVParser { static void Main() { using (var parser = new TextFieldParser("text.csv", Encoding.GetEncoding("Shift_JIS"))) { parser.TextFieldType = FieldType.Delimited; // フィールドはデリミタにより区切る(可変) parser.Delimiters = new[] {","}; // 区切り文字を指定 parser.CommentTokens = new[] {"#"}; // #で始まる行をコメントとする // parser.HasFieldsEnclosedInQuotes = false; // 引用符で括られたフィールドを持つか指定 // parser.TrimWhiteSpace = false; // フィールドの前後に含まれる空白を削除するか指定 while (!parser.EndOfData) { try { string[] row = parser.ReadFields(); // 1行読み込む foreach (string field in row) { field = field.Replace("\r\n", "n"); // 改行をnに置換 field = field.Replace(" ", "_"); // 空白を_に置換 Console.Write(field + "\t"); // タブ区切りで出力 } Console.WriteLine(); } catch(Exception ex) { Console.WriteLine(ex.Message); } } } } } </syntaxhighlight> <br><br> == ファイルを確実に削除する == <code>System.IO.File</code>クラスの<code>Delete</code>メソッドを使用する場合、読み取り専用ファイルに対して実行すると例外が発生する。<br> これを解決するには、ファイルを削除する前に、ファイルの読み取り専用属性を解除する。<br> <br> 以下の例では、ファイルの読み取り専用属性を解除して、ファイルを削除している。<br> <syntaxhighlight lang="c#"> public static void main(string[] args) { // 読み取り専用ファイルの場合でも削除する DeleteFile(@"C:\Hoge\"); } /// ----------------------------------------------------------------------------- /// <summary> /// 指定したファイルを削除する</summary> /// <param name="stFilePath"> /// 削除するファイルまでのパス</param> /// ----------------------------------------------------------------------------- public static void DeleteFile(string stFilePath) { System.IO.FileInfo cFileInfo = new System.IO.FileInfo(stFilePath); // ファイルが存在しているか判断する if(cFileInfo.Exists) { // 読み取り専用属性がある場合は、読み取り専用属性を解除する if((cFileInfo.Attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) { cFileInfo.Attributes = System.IO.FileAttributes.Normal; } // ファイルを削除する cFileInfo.Delete(); } } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの基礎 - ファイル
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse