プログラム小ネタ

スポンサーリンク
スポンサーリンク
スポンサーリンク

ファイルリストを使ったコピー

なかなか。。。。調べ方が悪いのか色々調べつくしてみたのですが、ファイルリストにあるファイルをコピーするだけのツールがありませんでした。

実はバックアップのためBD-Rに詰め込むだけ詰め込むツールPackAssistantというツールを使って10枚位作ったあとに11枚目でコピーに失敗(ファイルの数が多すぎた)時にそのアプリが落ちてしまいました。

幸いそのツールでエクスポート機能がありコピーしなければならないcsvを先に作ってあったので11枚からのリストは簡単に取り出せました。が、しかし。

こういった物って多分どこかにあるもんだと高をくくっていたのですがなかなか見つからず。ちょっと試しにバッチファイル作ってみたりしたのですが、コピーに失敗したりプログラムが開いたりと変な動きばかりで無駄な時間を過ごしておりました。

Unix系であればrsyncとか使えそうですが無いので自分で作ってみました。

ソース

VS使ってますし、gitのアカウントもあるのでそちらのほうで公開を考えましたが、たかが数十行だったのでこちらに公開しておきます。

using System;
using System.IO;
using System.Text;

namespace kakou
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.InputEncoding = Encoding.UTF8;
            Console.OutputEncoding = Encoding.UTF8;
            //Encodingの生成(文字コード)
            Encoding enc = System.Text.Encoding.GetEncoding("UTF-8");

            string[] Commands = System.Environment.GetCommandLineArgs();
            if (args.Length != 3)
            {
                Console.WriteLine("usage: kakou.exe [filelist.txt] [書換元パス] [書換後パス]\n");
                Console.WriteLine("kakou.exeは[filelist.txt]を1行ずつ読み込みその行のパスから");
                Console.WriteLine("[書換元パス]を検索し[書換後パス]に置き換えコピー先となります。");
                Console.WriteLine("その後コピー元からコピー先へパスを作りながらコピー開始します。");
                Console.WriteLine("[filelist.txt] : コピーしたいファイルのフルパスを一行ずつ書いたファイル。");
                Console.WriteLine("                 ファイルはUTF-8で記載する事。\n");
                Console.WriteLine("example: kakou.exe filelist.txt \"C:\\\" \"D:\\\"\n");
                Console.ReadLine();
                Environment.Exit(0);
            }
            string str, dst;
            string path = Commands[1];
            string srcfld = Commands[2];
            string dstfld = Commands[3];
            using (var file = new StreamReader(path, enc))
            {
                while ((str = file.ReadLine()) != null)
                {
                    dst = str;
                    dst = dst.Replace(srcfld, dstfld);
                    if (File.Exists(dst))
                    {
                        continue;
                    }
                    Console.WriteLine(dst);
                    CreateDirAndCopyFile(str, dst);
                }
                //Console.ReadLine();
            }
        }
        static void CreateDirAndCopyFile(string sourceFullPath, string distFullPath)
        {
            string distDir = Path.GetDirectoryName(distFullPath);
            if (!Directory.Exists(distDir))
            {
                Directory.CreateDirectory(distDir);
            }
            try
            {
                File.Copy(sourceFullPath, distFullPath, true);
            } catch (Exception e){
                Console.WriteLine(sourceFullPath);
                Console.WriteLine(e.Message);
                Environment.Exit(0);
            }
        }
    }
}

VS2019のC#で書きました。バイナリは怖いと思う人はツールをインストールしてコンパイルして下さい。バイナリは一応こちらkakou.exe

使い方

想定しているのはフルバックアップを取った時、なんらかの異常でコピーしきれなかった時リストを元にコピーを開始するために作りました。ファイルリストは1フォルダ内で収まっており、そのフォルダを別フォルダにコピーするために作りました。

kakou.exeはファイルリストに1行ずつ書かれているフルパスファイル名のファイルを引数によって書き換えられたフルパスへコピーを実行します。

引数1番目はファイルリスト名を指定します。ファイルリストはUTF-8で書かれている事が前提で、Windowsパスで書かれている物とします。なおファイルを指しているのが前提なのでディレクトリだけで終わっているパスは動きません。ディレクトリ対応はおいおいやっていく予定です。

引数2番目と3番目はファイルリスト中の書き換えたい文字列を記載します。例えばC:\ABC\DEF\test.txtとファイルリストに記載されているとします。コピー先としてC:\GHI\JKL\test.txtとしたい場合、kakou.exe filelist.txt “C:\ABC\DEF” “C:\GHI\JKL”
とします。

今後について

何か需要があれば変更するかもしれませんがソースを覗いてくれればわかりますが大した事をしていません。ソースの著作権は放棄しません。何か追加したりしたら一報だけ頂ければいいと思っています。

コメント

タイトルとURLをコピーしました