未経験からC#プログラマーになるならできた方が良いこと　～ファイル操作編～

未経験からプログラマーになるなら出来たらカッコいいことについてをまとめていきたいと思います。

第１回目は、**「ファイル操作」**

これはどんな職場に行こうが、絶対に必要になる技術なのでマスターして行って

お、こいつはできるじゃないかと思わせましょう！

#なぜファイル操作が必要なのか

プログラミングをやるのであればこのファイル操作は避けては通れない道です。

なぜなら、**あらゆるソフトウェアで使われているから**です。


例えば、

エラー処理のためのログの書き出し

その他にも設定ファイルを読み込んだり、顧客や様々なデータをファイルから読み込んだり書き出したりする必要があります。


C#からファイルでPythonを呼ぶときなどもそうです。

つまり、どんなプロジェクトでもファイル操作をすると言っても過言ではありません。

以上の理由から、**まず始めに未経験であるならばファイル操作をマスターして行きましょう。**


#ファイル操作

##追記（2021/04/08)：
これより以下からサンプルコードを提示していきます。
今回は、駆け出しの方に向けてプログラムが落ちないようにというところに注力してますので
あらゆるコードをExceptionを使っての例外処理してますが、このようにすべてに対してExceptionの例外処理してしまうと、落ちる根本原因があいまいになってしまうので、慣れてきたら例外処理を使わずに動かし、落ちないように努力し、その上で適した例外処理を当てていくようにしましょう。

```C#:
try {

 } 
catch (Exception ex)
{ 
    return; 
}
```
##ファイルを開く

```C#:
System.IO.FileStream FileStm; 
try {
    // ファイルのパスを変数に格納 　　　
    // ＠を付けることにより、￥がエスケープでなくなります。 　　　
    string filePath = @"C:\test.txt"; 　　　// FileStreamのインスタンスを作成 　　　
    FileStm = new System.IO.FileStream( filePath, System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
 } 
catch (Exception ex)
{ 
    return; 
}
```

変数のfilePathに＠が使われていますが、これはエスケープ文字「￥」「\」を無効にさせます。

なので、＠なしでコーディングしようと思ったら
string filePath = "C:\\\test.txt";とコーディングしましょう。
System.IO.FileStreamの引数は、以下のURLに細かな説明があります。
https://docs.microsoft.com/en-us/dotnet/api/system.io.filemode?view=net-5.0

引数を色々変えてテストしてみると理解が深まりますよ！


##ファイルを読み込む
```C#:
System.IO.StreamReader StmRdr; 
try { 
    StmRdr = new System.IO.StreamReader(FileStm, Encoding.GetEncoding("UTF-8")); 
} 
catch (Exception ex) 
{ 
    return;
 } 

while (!StmRdr.EndOfStream) 
{ 
    string lines = ""; 
    try { 
        lines = StmRdr.ReadLine(); 
    } 
    catch (Exception ex) 
    { 
        return; 
    } 
}
```

以下のコードでFileStream（第一引数のFileStm）で開いたものを読み込めます。

```C#:

StmRdr = new System.IO.StreamReader(FileStm, Encoding.GetEncoding("UTF-8"));

```

第二引数で文字コードをUTF-8としていますが、Shift-JISを求められたり他の文字コードを求められたりするので

会社でファイル操作をお願いされた場合は、この文字コードも確認すると良いでしょう。




System.IO.StreamReaderで作成したインスタンスStmRdrの最後までループを回します。

```C#:
while (!StmRdr.EndOfStream)
```

！が頭に付いているのは、falseという意味なので以下のコードと同じ意味になります

```C#:
while(false==StmRdr.EndOfStream)
```

##ファイルの書き込み

```C#
System.IO.StreamWriter writer;
try { 
    string filePath = @"C:\output.txt"; 
    Encoding enc = Encoding.GetEncoding("UTF-8"); 
    writer = new System.IO.StreamWriter(filePath, false, enc); 
    writer.WriteLine("書き込み内容"); 
    writer.Close(); 
} catch (Exception ex) { 
    return; 
}
```

以上のコードを実行するとファイルの作成を行い作成したファイルに任意の文字列を書き込みます。
もう一度実行してしまうと、始めに記載した内容が消えて書き直してしまいます。



文字列をファイルに追加で書き込みたい場合は、以下のコードのようにAppendを使用しましょう。

```C#

try { 
    string filePath = @"C:\output.txt"; 
    System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); 
    System.IO.File.AppendAllText(filePath, "書き込み内容", enc); 
} catch (Exception ex) {
     return; 
}

```

##ファイルの移動・コピー

###ファイルの移動

```C#
try { 
    string from = ""; // コピー元 
    string to = "";// コピー先 
    System.IO.File.Move(from, to); 
} catch (Exception ex) { 
    return; 
}
```

###ファイルのコピー

```C#
try { 
    string from = ""; 
    string to = ""; 
    System.IO.File.Copy(from, to); 
} catch (Exception ex) {
    return; 
}
```

##ファイルの削除

```C#
try { 
    string delFilePath = @"C:\WorkSpace\output.txt"; 
    System.IO.File.Delete(delFilePath); 
} catch (Exception ex) { 
    return; 
}
```

##まとめ

以上になります。
少しでもエンジニアの方のためになれば幸いです。