「C Sharpの基礎 - ファイル」の版間の差分
編集の要約なし |
|||
(同じ利用者による、間の8版が非表示) | |||
1行目: | 1行目: | ||
== 概要 == | |||
C#では、<code>System.IO</code>名前空間を使用することにより、ファイルの読み書き、作成、削除等の基本的な操作を行うことができる。<br> | |||
<br> | |||
テキストファイルの読み込みには、主に<code>StreamReader</code>クラスや<code>File.ReadAllText</code>メソッドが使用される。<br> | |||
これらを使用することにより、テキストファイルの内容を簡単に文字列として取得できる。<br> | |||
<br> | |||
テキストファイルへの書き込みには、主に<code>StreamWriter</code>クラスや<code>File.WriteAllText</code>メソッドが使用される。<br> | |||
<br> | |||
バイナリファイルを扱う場合は、<code>FileStream</code>クラスを使用する。<br> | |||
これにより、バイトデータの読み書きが可能になる。<br> | |||
また、非同期操作を行う場合は、<code>ReadAsync</code>メソッドや<code>WriteAsync</code>メソッド等を使用することで、効率的にファイル操作を行うことができる。<br> | |||
<br> | |||
ファイルパスの操作には、<code>Path</code>クラスが役立つ。<br> | |||
このクラスを使用することで、ファイル名の取得や拡張子の変更、ディレクトリの結合等の操作が簡単に行える。<br> | |||
<br> | |||
セキュリティの観点からは、ファイルアクセス権限の設定が重要である。<br> | |||
<code>FileInfo</code>クラスや<code>DirectoryInfo</code>クラスを使用して、ファイルやディレクトリのアクセス権限を確認したり変更することができる。<br> | |||
<br> | |||
エラーハンドリングについて、ファイル操作時には様々な例外が発生する可能性があるため、try-catchブロックを使用して適切に対処することが基本である。<br> | |||
<br> | |||
また、大容量ファイルを扱う場合は、メモリ効率を考慮する必要がある。<br> | |||
ファイルを1度に全て読み込むのではなく、ストリームを使用して少しずつ読み込むことにより、メモリ使用量を抑えることができる。<br> | |||
<br><br> | |||
== バイナリファイル == | == バイナリファイル == | ||
==== バイナリファイルの読み込みと書き込み ==== | ==== バイナリファイルの読み込みと書き込み ==== | ||
ファイルの内容をすべてbyte配列に読み込む、または、byte配列全体をファイルに書き込む場合、<br> | ファイルの内容をすべてbyte配列に読み込む、または、byte配列全体をファイルに書き込む場合、<br> | ||
<code>File</code>クラス(<code>System.IO</code>名前空間)の<code>ReadAllBytes</code>メソッドおよび<code>WriteAllBytes</code>メソッドを使用する。<br> | |||
これらのメソッド(静的) | <br> | ||
これらのメソッド(静的)では、"ファイルを開く"、"byte配列への読み込みまたはbyte配列の書き込み"、"ファイルを閉じる"という3つの処理を<br> | |||
<code>ReadAllBytes</code>メソッドで実行可能である。<br> | |||
<code>ReadAllBytes</code>メソッドは、読み込むファイルのパス名をパラメータに指定して呼ぶと、戻り値としてファイルの内容を読み込んだbyte配列を返す。<br> | |||
<br> | |||
< | また、<code>WriteAllBytes</code>メソッドでは、書き込むファイルのパス名(ファイルが存在する場合は上書き)と書き込むbyte配列をパラメータで指定する。<br> | ||
なお、<code>WriteAllBytes</code>メソッドの戻り値は無い。<br> | |||
<syntaxhighlight lang="c#"> | |||
byte[] data = File.ReadAllBytes(@"hoge.bin"); // 読み込み | byte[] data = File.ReadAllBytes(@"hoge.bin"); // 読み込み | ||
File.WriteAllBytes(@"newhoge.bin", data); // 書き込み | File.WriteAllBytes(@"newhoge.bin", data); // 書き込み | ||
</ | </syntaxhighlight> | ||
<br> | |||
==== バイナリファイルを固定サイズで分割する ==== | |||
以下の例では、<code>File</code>クラスの<code>ReadAllBytes</code>メソッドと<code>WriteAllBytes</code>メソッドを使用している。<br> | |||
バイナリファイルを読み込み、それを固定サイズ(1[MB])の複数ファイルに分割して出力している。<br> | |||
<br> | <br> | ||
なお、出力する最後のファイルは固定サイズに満たない場合がある。<br> | |||
<syntaxhighlight lang="C#"> | <syntaxhighlight lang="C#"> | ||
using System; | using System; | ||
51行目: | 78行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
<u>※注意</u><br> | |||
<u>ReadAllBytesメソッドは、ファイル全体を一度に読み込むため、</u><br> | |||
<u>サイズの大きいファイルを扱う場合は、読み込みに掛かる時間や使用するメモリ量について注意が必要である。</u><br> | |||
<br> | <br> | ||
==== | ==== 非同期でバイナリファイルを読み書きする ==== | ||
以下の例では、バイナリファイルへ書き込んだ後、そのバイナリファイルを読み込んでいる。<br> | |||
バイナリファイルを書き込み用として開く時に<code>FileMode.Create</code>を指定しているため、上書きになる。(追記する場合は、<code>FileMode.Append</code>)<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
async Task BinaryReadWriteAsync(byte[] data) | public async Task BinaryReadWriteAsync(byte[] data) | ||
{ | { | ||
const string FilePath = @".\sample.dat"; // 読み書きするファイル | const string FilePath = @".\sample.dat"; // 読み書きするファイル | ||
// | // バイナリファイルとして書き込む | ||
// ファイルを上書きモードで開く( | // ファイルを上書きモードで開く(ファイルが存在しない場合は作成する) | ||
// | // 追記モードにするには、FileMode.Appendに変更する | ||
using (var fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write)) | using (var fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write)) | ||
{ | { | ||
102行目: | 130行目: | ||
== テキストファイル == | == テキストファイル == | ||
==== テキストファイルの読み込みと書き込み ==== | ==== テキストファイルの読み込みと書き込み ==== | ||
<code>StreamReader</code>クラスを使用して、<br> | |||
テキストファイルの読み込みと書き込み、<code>using</code>構文によるファイルのクローズ、例外処理等を記載する。<br> | |||
<br> | <br> | ||
テキストファイルの内容を読み込むには、以下の3つの処理からなる。<br> | テキストファイルの内容を読み込むには、以下の3つの処理からなる。<br> | ||
# | # ファイルを開く | ||
# | # ファイルの内容を読み込む | ||
# | # ファイルを閉じる | ||
<br> | <br> | ||
==== テキストファイルを開く ==== | ==== テキストファイルを開く ==== | ||
ファイルを開くにはいくつかの方法が存在するが、UTF-8のファイルを開く場合、<br> | |||
<code>StreamReader</code>クラス(<code>System.IO</code>名前空間)を使用する。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
StreamReader sr = new StreamReader(@"readme.txt", Encoding.UTF8); | StreamReader sr = new StreamReader(@"readme.txt", Encoding.UTF8); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、Shift-JISのファイルを開く場合は、以下のように記述する。<br> | |||
< | <syntaxhighlight lang="c#"> | ||
StreamReader sr = new StreamReader(@"readme.txt", Encoding.GetEncoding("Shift_JIS")); | StreamReader sr = new StreamReader(@"readme.txt", Encoding.GetEncoding("Shift_JIS")); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== テキストファイルを読み込む ==== | ==== テキストファイルを読み込む ==== | ||
<code>StreamReader</code>クラスの<code>ReadToEnd</code>メソッドを使用して、テキストファイルの内容を一括して読み込むことができる。<br> | |||
また、<code>ReadToEnd</code>メソッドでは、改行文字等も含めて、全ての1つの文字列として読み込まれる。<br> | |||
<br> | <br> | ||
==== usingステートメントを使用してファイルを閉じる ==== | ==== 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> | |||
<br> | <br> | ||
==== | ==== テキストファイルの一括読み込み(変数の使用) ==== | ||
以下の例では、<code>ReadToEnd</code>メソッドを非同期処理に対応した<code>ReadToEndAsync</code>メソッドを使用して、<br> | |||
ファイルの全ての内容を一括して読み込んでいる。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using System; | using System; | ||
159行目: | 190行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <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#"> | <syntaxhighlight lang="c#"> | ||
using System; | using System; | ||
194行目: | 229行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== テキストファイルの一括読み込み(変数の使用) ==== | |||
テキストファイルの全ての内容を1つの変数に読み込む場合、<code>File</code>クラスの<code>ReadAllText</code>メソッドを使用する。<br> | |||
<code>ReadAllText</code>メソッドで使用する標準の文字コードは、UTF-8である。<br> | |||
<br> | <br> | ||
以下の例では、テキストファイルの内容を一括して変数に読み込んでいる。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using System.Text; | using System.Text; | ||
215行目: | 248行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <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#"> | <syntaxhighlight lang="c#"> | ||
using System.Text; | using System.Text; | ||
232行目: | 270行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | |||
== ファイルの削除 == | |||
==== 読み取り専用ファイルの削除 ==== | |||
<code>System.IO.File</code>クラスの<code>Delete</code>メソッドを使用する場合、読み取り専用ファイルに対して実行すると例外が発生する。<br> | |||
これを解決するには、ファイルを削除する前に、ファイルの読み取り専用属性を解除する。<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> | |||
== パーミッション == | |||
.NET 5以降では、<code>System.IO.FileSystem</code>名前空間に<code>UnixFileMode</code>列挙型が追加された。<br> | |||
この列挙型を使用して、UNIX系OSのファイルパーミッションを扱うことができる。<br> | |||
<br> | |||
<u>ただし、<code>UnixFileMode</code>プロパティはLinux環境でのみ動作することに注意する。</u><br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
class FilePermissions | |||
{ | |||
static void Main(string[] args) | |||
{ | |||
// lsコマンドのファイルパス | |||
string filePath = $"/usr/bin/ls"; | |||
// ファイルが存在するかどうかを確認 | |||
if (!File.Exists(filePath)) | |||
{ | |||
Console.WriteLine("指定されたファイルが存在しない"); | |||
return; | |||
} | |||
try | |||
{ | |||
// ファイルの情報を取得 | |||
FileInfo fileInfo = new FileInfo(filePath); | |||
// Unixファイルモードを取得 | |||
UnixFileMode mode = fileInfo.UnixFileMode; | |||
// パーミッションを8進数で表示 | |||
Console.WriteLine($"ファイル: {filePath}"); | |||
Console.WriteLine($"パーミッション: {Convert.ToString((int)mode, 8).PadLeft(4, '0')}"); | |||
// 詳細なパーミッション情報を表示 | |||
Console.WriteLine("詳細:"); | |||
Console.WriteLine($"ユーザ: {((mode & UnixFileMode.UserRead) != 0 ? "r" : "-")}" + | |||
$"{((mode & UnixFileMode.UserWrite) != 0 ? "w" : "-")}" + | |||
$"{((mode & UnixFileMode.UserExecute) != 0 ? "x" : "-")}"); | |||
Console.WriteLine($"グループ: {((mode & UnixFileMode.GroupRead) != 0 ? "r" : "-")}" + | |||
$"{((mode & UnixFileMode.GroupWrite) != 0 ? "w" : "-")}" + | |||
$"{((mode & UnixFileMode.GroupExecute) != 0 ? "x" : "-")}"); | |||
Console.WriteLine($"その他: {((mode & UnixFileMode.OtherRead) != 0 ? "r" : "-")}" + | |||
$"{((mode & UnixFileMode.OtherWrite) != 0 ? "w" : "-")}" + | |||
$"{((mode & UnixFileMode.OtherExecute) != 0 ? "x" : "-")}"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"エラーが発生: {ex.Message}"); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C_Sharp]] | [[カテゴリ:C_Sharp]] |
2024年9月16日 (月) 14:39時点における最新版
概要
C#では、System.IO
名前空間を使用することにより、ファイルの読み書き、作成、削除等の基本的な操作を行うことができる。
テキストファイルの読み込みには、主にStreamReader
クラスやFile.ReadAllText
メソッドが使用される。
これらを使用することにより、テキストファイルの内容を簡単に文字列として取得できる。
テキストファイルへの書き込みには、主にStreamWriter
クラスやFile.WriteAllText
メソッドが使用される。
バイナリファイルを扱う場合は、FileStream
クラスを使用する。
これにより、バイトデータの読み書きが可能になる。
また、非同期操作を行う場合は、ReadAsync
メソッドやWriteAsync
メソッド等を使用することで、効率的にファイル操作を行うことができる。
ファイルパスの操作には、Path
クラスが役立つ。
このクラスを使用することで、ファイル名の取得や拡張子の変更、ディレクトリの結合等の操作が簡単に行える。
セキュリティの観点からは、ファイルアクセス権限の設定が重要である。
FileInfo
クラスやDirectoryInfo
クラスを使用して、ファイルやディレクトリのアクセス権限を確認したり変更することができる。
エラーハンドリングについて、ファイル操作時には様々な例外が発生する可能性があるため、try-catchブロックを使用して適切に対処することが基本である。
また、大容量ファイルを扱う場合は、メモリ効率を考慮する必要がある。
ファイルを1度に全て読み込むのではなく、ストリームを使用して少しずつ読み込むことにより、メモリ使用量を抑えることができる。
バイナリファイル
バイナリファイルの読み込みと書き込み
ファイルの内容をすべてbyte配列に読み込む、または、byte配列全体をファイルに書き込む場合、
File
クラス(System.IO
名前空間)のReadAllBytes
メソッドおよびWriteAllBytes
メソッドを使用する。
これらのメソッド(静的)では、"ファイルを開く"、"byte配列への読み込みまたはbyte配列の書き込み"、"ファイルを閉じる"という3つの処理を
ReadAllBytes
メソッドで実行可能である。
ReadAllBytes
メソッドは、読み込むファイルのパス名をパラメータに指定して呼ぶと、戻り値としてファイルの内容を読み込んだbyte配列を返す。
また、WriteAllBytes
メソッドでは、書き込むファイルのパス名(ファイルが存在する場合は上書き)と書き込むbyte配列をパラメータで指定する。
なお、WriteAllBytes
メソッドの戻り値は無い。
byte[] data = File.ReadAllBytes(@"hoge.bin"); // 読み込み
File.WriteAllBytes(@"newhoge.bin", data); // 書き込み
バイナリファイルを固定サイズで分割する
以下の例では、File
クラスのReadAllBytes
メソッドとWriteAllBytes
メソッドを使用している。
バイナリファイルを読み込み、それを固定サイズ(1[MB])の複数ファイルに分割して出力している。
なお、出力する最後のファイルは固定サイズに満たない場合がある。
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++;
}
}
}
※注意
ReadAllBytesメソッドは、ファイル全体を一度に読み込むため、
サイズの大きいファイルを扱う場合は、読み込みに掛かる時間や使用するメモリ量について注意が必要である。
非同期でバイナリファイルを読み書きする
以下の例では、バイナリファイルへ書き込んだ後、そのバイナリファイルを読み込んでいる。
バイナリファイルを書き込み用として開く時にFileMode.Create
を指定しているため、上書きになる。(追記する場合は、FileMode.Append
)
public 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();
}
テキストファイル
テキストファイルの読み込みと書き込み
StreamReader
クラスを使用して、
テキストファイルの読み込みと書き込み、using
構文によるファイルのクローズ、例外処理等を記載する。
テキストファイルの内容を読み込むには、以下の3つの処理からなる。
- ファイルを開く
- ファイルの内容を読み込む
- ファイルを閉じる
テキストファイルを開く
ファイルを開くにはいくつかの方法が存在するが、UTF-8のファイルを開く場合、
StreamReader
クラス(System.IO
名前空間)を使用する。
StreamReader sr = new StreamReader(@"readme.txt", Encoding.UTF8);
また、Shift-JISのファイルを開く場合は、以下のように記述する。
StreamReader sr = new StreamReader(@"readme.txt", Encoding.GetEncoding("Shift_JIS"));
テキストファイルを読み込む
StreamReader
クラスのReadToEnd
メソッドを使用して、テキストファイルの内容を一括して読み込むことができる。
また、ReadToEnd
メソッドでは、改行文字等も含めて、全ての1つの文字列として読み込まれる。
usingステートメントを使用してファイルを閉じる
StreamReader
クラスは、IDisposable
インタフェースを実装しているため、(スーパークラスのTextReader
クラスが実装している)
Close
メソッドの代わりに、using
ステートメントを利用することもできる。
using
ステートメントを抜ける時、自動的にStreamReader
クラスのDispose
メソッドを呼び出して、
その中でClose
メソッドが呼び出される。
ファイルが読み込めない時のエラー処理
ファイルが存在しない場合やファイルの読み込み中にディスク等に何らかの障害が発生する場合、
例外が発生してプログラムの実行が中断されるため、例外処理を記述する必要がある。
テキストファイルの一括読み込み(変数の使用)
以下の例では、ReadToEnd
メソッドを非同期処理に対応したReadToEndAsync
メソッドを使用して、
ファイルの全ての内容を一括して読み込んでいる。
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);
}
ファイルの内容を1行ずつ読み込む
ファイルの全ての内容を1つの変数に読み込むよりも、1行ずつ読み込んで文字列の配列に代入する方が扱いやすい場合がある。
ファイルから1行読み込むには、StreamReader
クラスのReadLine
メソッドを使用する。
ReadLine
メソッドは、ファイルから1行のみ読み込み、内部で読み取り位置を1行分進める。
読み取り位置がファイルの末尾に達した場合、null
を返す。
なお、.NET Framework 2.0以降では、File
クラス(System.IO
名前空間)において、
ファイルを開く・内容を読み込む・ファイルを閉じるという一連の処理を1つのメソッドで行うReadAllText
メソッドとReadAllLines
メソッドが追加されている。
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);
}
テキストファイルの一括読み込み(変数の使用)
テキストファイルの全ての内容を1つの変数に読み込む場合、File
クラスのReadAllText
メソッドを使用する。
ReadAllText
メソッドで使用する標準の文字コードは、UTF-8である。
以下の例では、テキストファイルの内容を一括して変数に読み込んでいる。
using System.Text;
using System.IO;
try
{ // ファイルの読み込み
string text1 = File.ReadAllText(@"hoge.txt", Encoding.UTF8);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
テキストファイルの一括読み込み(配列の使用)
テキストを1行ずつ処理する場合、各行を要素とする文字列配列を使用する。
これは、System.IO.File
クラスのReadAllLines
メソッドを使用して実行する。
ReadAllLines
メソッドで使用する標準の文字コードは、UTF-8である。
なお、ReadAllLines
メソッドは、ファイル末尾の改行文字を無視する。
ファイル末尾に改行文字がある場合、ReadAllLines
メソッドで得られる行数は1行少なくなる。
以下の例では、テキストファイルの内容を一括して配列に読み込んでいる。
using System.Text;
using System.IO;
try
{ // ファイルの読み込み
string[] lines1 = File.ReadAllLines(@"hoge.txt", Encoding.UTF8);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
ファイルの削除
読み取り専用ファイルの削除
System.IO.File
クラスのDelete
メソッドを使用する場合、読み取り専用ファイルに対して実行すると例外が発生する。
これを解決するには、ファイルを削除する前に、ファイルの読み取り専用属性を解除する。
以下の例では、ファイルの読み取り専用属性を解除して、ファイルを削除している。
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();
}
}
パーミッション
.NET 5以降では、System.IO.FileSystem
名前空間にUnixFileMode
列挙型が追加された。
この列挙型を使用して、UNIX系OSのファイルパーミッションを扱うことができる。
ただし、UnixFileMode
プロパティはLinux環境でのみ動作することに注意する。
using System;
using System.IO;
class FilePermissions
{
static void Main(string[] args)
{
// lsコマンドのファイルパス
string filePath = $"/usr/bin/ls";
// ファイルが存在するかどうかを確認
if (!File.Exists(filePath))
{
Console.WriteLine("指定されたファイルが存在しない");
return;
}
try
{
// ファイルの情報を取得
FileInfo fileInfo = new FileInfo(filePath);
// Unixファイルモードを取得
UnixFileMode mode = fileInfo.UnixFileMode;
// パーミッションを8進数で表示
Console.WriteLine($"ファイル: {filePath}");
Console.WriteLine($"パーミッション: {Convert.ToString((int)mode, 8).PadLeft(4, '0')}");
// 詳細なパーミッション情報を表示
Console.WriteLine("詳細:");
Console.WriteLine($"ユーザ: {((mode & UnixFileMode.UserRead) != 0 ? "r" : "-")}" +
$"{((mode & UnixFileMode.UserWrite) != 0 ? "w" : "-")}" +
$"{((mode & UnixFileMode.UserExecute) != 0 ? "x" : "-")}");
Console.WriteLine($"グループ: {((mode & UnixFileMode.GroupRead) != 0 ? "r" : "-")}" +
$"{((mode & UnixFileMode.GroupWrite) != 0 ? "w" : "-")}" +
$"{((mode & UnixFileMode.GroupExecute) != 0 ? "x" : "-")}");
Console.WriteLine($"その他: {((mode & UnixFileMode.OtherRead) != 0 ? "r" : "-")}" +
$"{((mode & UnixFileMode.OtherWrite) != 0 ? "w" : "-")}" +
$"{((mode & UnixFileMode.OtherExecute) != 0 ? "x" : "-")}");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生: {ex.Message}");
}
}
}