VisualStudioで初めてのexe（ファイルをリネームコピーするだけの簡単なやつ）

#何を作りたいん？

リネームコピーしたいファイルをexeに放り込んだら…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1f877101-a140-5b46-8b93-6022ce7ab78f.png)
複製しつつ、現在時刻でリネームしてくれるやーつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/469e3f4c-5dfb-068f-e10a-d3501641134e.png)

ファイルをただコピペするだけだと…

* 『てんぷれーと - コピー.clip』になったりして、描いた絵を画像で出力する時とかにファイル名重複しちゃう。
* 別フォルダーに切り取りコピーすると作成日が上書きされて、管理する上でちょっとよろしくない。

ということがあるので、ファイル名に時間情報を埋め込みしたいです。
**でも毎回手でファイル名変えるのは面倒くさい！**

#VisualStudoインストール

インストールまでの環境構築は [ここ](https://qiita.com/waokitsune/items/5defc1bd9e338b6159a9) 。

#プロジェクト作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/32e62791-4163-2c52-7505-436a65b6adef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/63f07c5e-737f-a95f-bcdc-4ff7ec1d12c0.png)
機能追加に合わせてウィンドウとかボタンとか設置したい場合を考えて、.NET Frameworkにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/de337675-f2ee-03f4-a9d5-7307e87329a0.png)
.NET FrameworkのバージョンはWindows10にデフォルトで用意されている4.5にしました。
他の人のPCでも安定して動いてもらうことが必要なら、最新すぎず、かといって古すぎない4.5が丁度いいかなって感じです。
個人で使う分にはバージョンはあまり気にしなくてもよいと思います。


#引数チェックと放り込まれたファイルのパスを表示するところまで

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FileCopy
{
	class Program
	{
		static void Main(string[] args)
		{

			//引数バリデート
			if(args.Length != 1)
			{
				MessageBox.Show("コピー元のファイルを1つだけドラッグドロップして下さい。",
					"エラー",
					MessageBoxButtons.OK,
					MessageBoxIcon.Error);
				return;
			}

			Console.WriteLine(args[0]);
			Console.WriteLine("↑exeにドラッグドロップしたファイルのパスです");
			Console.ReadKey();


		}
	}
}
```

コーディングする時に入力サポートしてくれるのが、VisualStudioの良いところです。

`sing System.Windows.Forms;` が抜けてると下記のようにサポートしてくれますです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/90ce9512-bf35-5650-ab47-e90a63e97728.png)
ダブルクリックすると自動で `sing System.Windows.Forms;` を入れてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6e04e052-5540-5641-df42-620b31b62199.png)

#ビルドでexe作成

ビルドするとexeが作成されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3853e80b-008a-f3f3-837f-4c805c82be31.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e128425b-58ea-87a7-2c74-2e32bacc4924.png)


#動かしてみよう

exeをただ起動したり、2ファイル以上を放り込むと下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1b363697-f198-8590-35bc-e265bcc8817f.png)

ちゃんと1ファイルだけ放り込むと下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/31702d07-48cc-44ee-21d4-d2ccf78e8d61.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bada5439-f3c6-01d3-ef83-324b16b841fd.png)


#完成版

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FileCopy
{
	class Program
	{
		static void Main(string[] args)
		{

			//引数バリデート
			if (args.Length != 1)
			{
				MessageBox.Show("コピー元のファイルを1つだけドラッグドロップして下さい。",
					"エラー",
					MessageBoxButtons.OK,
					MessageBoxIcon.Error);
				return;
			}


			string from_file_path_ = args[0];


			//コピーするファイルパスを決定するぞい
			string to_file_path_;

			//元ファイルと同じフォルダーにコピーします
			to_file_path_ = Path.GetDirectoryName(from_file_path_) + @"\";

			//ファイル名は現在時刻を元に決定
			//2021年05月01日18時25分なら『20210501_1825』
			to_file_path_ += DateTime.Now.ToString("yyyyMMdd_HHmm");

			//拡張子は元ファイルから引き継ぎます
			to_file_path_ += Path.GetExtension(from_file_path_);


			//ファイル上書きになる場合はコピーせずに中断
			if (File.Exists(to_file_path_))
			{
				MessageBox.Show("ファイルの上書きが発生してしまうので処理を中断します。" + to_file_path_,
					"エラー",
					MessageBoxButtons.OK,
					MessageBoxIcon.Error);
				return;
			}


			//ファイルコピー実行！
			File.Copy(from_file_path_, to_file_path_);


		}
	}
}
```

#蛇足

* メッセージボックス出す。
* ファイルパスからフォルダーパスを取得。
* ファイルパスから拡張子を取得。
* フォーマットした現在時刻を取得。
* ファイル存在チェック。
* ファイルコピー。

とかよく使うのを盛り込んでみました。
try catchとか無いけどまあチュートリアルということで…

#バージョン

Windows 10 Pro バージョン 20H2 OSビルド 19042.928
Visual Studio Community 2019 Version 16.9.4
.NET Framework 4.5