ファイルの時間属性を変更したい！[C#]

#概要
今回はRaspberry PIではなくWindowsでファイルの属性である「作成日時、更新日時、アクセス日時」を指定した日時に変更するコマンドを作成したいと思います。

#事前作業
①デスクトップにVisual Studio communityバージョンをインストールします。

ダウンロードサイト（★コミュニティ★）
https://visualstudio.microsoft.com/ja/downloads/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/63f08696-9133-fdc4-f9ed-f124df723990.png)

②インストールオプションはすべてインストールも良いですが、アプリ開発をしないなら関連パッケージはインストールしない方がよいです。

#プログラム内容
コマンドは基本的にパラメータを何も指定しない場合はコマンドの使い方のHELP内容が表示されるようにします。
①ファイル情報を確認したい場合、下記のコマンドで確認します。
例）finfo filename
②ファイル情報の「作成日時、更新日時、アクセス日時」を変更したい場合、下記のコマンドで確認します。
例）finfo filename "作成日時"
※作成日時が「更新日時、アクセス日時」に設定されます。
例）finfo filename "作成日時" "更新日時"
※作成日時、更新日時が該当属性に更新されます。アクセス日時には「更新日時」が設定されます。

#プログラムソース
下記のソースを「Windowsのコンソールアプリケーション（.Net Framework）」プロジェクトから作成します。

~~~bash
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace finfo
{
    class Program
    {
        static void Main(string[] args)
        {
            //ファイル属性変更は最大３個の引数
            if (args.Length >= 2)
            {
                fileEdit(args);
            }
            else if (args.Length == 1&& args[0] != "-h")
            {
                fileInfo(args[0]);
            }
            else
            {
                help();
            }
        }

        public static void help()
        {
            Console.WriteLine("=======================================");
            Console.WriteLine("使い方");
            Console.WriteLine("=======================================");
            Console.WriteLine("①ファイル情報出力の指定方");
            Console.WriteLine("例）finfo filename");
            Console.WriteLine("②ファイル情報出力の指定方");
            Console.WriteLine("例）finfo filename \"YYYY-MM-DD HH:MM:SS\"");
            Console.WriteLine("例）finfo filename \"YYYY-MM-DD HH:MM:SS\" \"YYYY-MM-DD HH:MM:SS\"");
            Console.WriteLine("=======================================");
        }

        public static void fileInfo(string file)
        {
            if (!File.Exists(file))
            {
                Console.WriteLine("指定したファイルは現在のフォルダに存在しません。");
                return;
            }

            var info = new FileInfo(file);
            Console.WriteLine("=======================================");
            Console.WriteLine("ファイル情報");
            Console.WriteLine("=======================================");
            Console.WriteLine("ファイル名   : " + info.Name);
            Console.WriteLine("ファイルパス : " + info.FullName);
            Console.WriteLine("作成日時     : " + info.CreationTime);
            Console.WriteLine("更新日時     : " + info.LastWriteTime);
            Console.WriteLine("サイズ       : " + info.Length + " Bytes");
            Console.WriteLine("アクセス日時 : " + info.LastAccessTime);
            Console.WriteLine("=======================================");
        }

        public static void fileEdit(string[] args)
        {
            DateTime createTime;
            DateTime writeTime;
            string file = "./" + args[0];

            if (!File.Exists(file))
            {
                Console.WriteLine("指定したファイルは現在のフォルダに存在しません。");
                return;
            }

            //時間を設定
            if (args.Length == 3)
            {
                createTime = Convert.ToDateTime(args[1]);
                writeTime = Convert.ToDateTime(args[2]);
            }
            else
            {
                createTime = Convert.ToDateTime(args[1]);
                writeTime = Convert.ToDateTime(args[1]);
            }

            var info = new FileInfo(file);

            //作成日時と更新日時を別々指定したい場合
            if (createTime != null && writeTime != null)
            {
                File.SetCreationTime(file, createTime);
                File.SetLastWriteTime(file, writeTime);
                File.SetLastAccessTime(file, writeTime);
            }
            //作成日時と更新日時を同じ日時に指定したい場合
            else
            {
                File.SetCreationTime(file, createTime);
                File.SetLastWriteTime(file, createTime);
                File.SetLastAccessTime(file, createTime);
            }

            Console.WriteLine("=======================================");
            Console.WriteLine("ファイル更新情報");
            Console.WriteLine("=======================================");
            Console.WriteLine("ファイル名   : " + info.Name);
            Console.WriteLine("ファイルパス : " + info.FullName);
            Console.WriteLine("作成日時     : " + info.CreationTime);
            Console.WriteLine("更新日時     : " + info.LastWriteTime);
            Console.WriteLine("サイズ       : " + info.Length + " Bytes");
            Console.WriteLine("アクセス日時 : " + info.LastAccessTime);
            Console.WriteLine("=======================================");
        }
    }
}
~~~

#実行結果
下記の内容通りに動作することを確認しました。

~~~bash
C:\work\finfo\finfo\bin\Release>finfo.exe Program.cs
=======================================
ファイル情報
=======================================
ファイル名   : Program.cs
ファイルパス : C:\work\finfo\finfo\bin\Release\Program.cs
作成日時     : 2021/05/02 3:24:02
更新日時     : 2021/05/02 3:22:55
サイズ       : 4681 Bytes
アクセス日時 : 2021/05/02 3:24:03
=======================================
C:\work\finfo\finfo\bin\Release>finfo.exe Program.cs  "2021/05/02 23:58:02"
=======================================
ファイル更新情報
=======================================
ファイル名   : Program.cs
ファイルパス : C:\work\finfo\finfo\bin\Release\Program.cs
作成日時     : 2021/05/02 23:58:02
更新日時     : 2021/05/02 23:58:02
サイズ       : 4681 Bytes
アクセス日時 : 2021/05/02 23:58:02
=======================================

C:\work\finfo\finfo\bin\Release>finfo.exe Program.cs  "2021/05/02 23:58:02" "2021/05/02 23:59:32"
=======================================
ファイル更新情報
=======================================
ファイル名   : Program.cs
ファイルパス : C:\work\finfo\finfo\bin\Release\Program.cs
作成日時     : 2021/05/02 23:58:02
更新日時     : 2021/05/02 23:59:32
サイズ       : 4681 Bytes
アクセス日時 : 2021/05/02 23:59:32
=======================================
~~~

#終わりに
これでファイルの属性を変更することができます。
どんなファイルも属性変更が可能です。
エクセルファイルまたは実行ファイルなども可能です。
(^^)//