読者です 読者をやめる 読者になる 読者になる

みかづきの色々

デバイス(スマホからキャンプ用品まで)とかプログラミングとか中心のいろいろ試験的なブログ。

なろう原稿書き支援用雑品を作ってみる。

趣味なのだが、82年からぼつぼつ小説を書いている。
知人の同人誌くらいにしか載った事がないのだけど。
最近は小説投稿サイト「小説家になろう」を利用している事が多い。一応、ライフワークなテーマもあったりして。

ところで、自サイトで原稿管理していた頃の違い、今は一話ごとにテキスト管理している事が多い。
いち作品ごとのフォルダがあり、 ram-001.txt みたいなのが並んでいて、ram-setting.txt だったら設定、みたいな感じだ。

この番号管理っていうか「新しい番号ファイルを作るの自動化したいな」ってのがありまして。
いや、わりと毎日更新とかしていると面倒なんですよ、いやマジで。
Rubyで書けばいいんでしょうけど、天邪鬼なんで、C#で書いてみました。

いやー雑品ですねえ。

まぁ、Visual Studio 2010 C# Express あたりでコンソールプロジェクト作って、これぶっこんでコンパイルすれば、まんま使えるかと。

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Text;

namespace novelc
{
    class Program
    {
        static string getNovname(string fn)
        {
            string r = fn;
            r = Regex.Replace(r, @"\-\d{1,9}\.txt$", "");
            return (r);
        }

        static string getNumberFromFilename(string fn)
        {
            string r = fn;
            r = Regex.Replace(r, @"^.+\-(\d{1,9})\.txt$", "$1");
            return (r);
        }

        static string filefilter(string fn)
        {
            string r = fn;
            r = Regex.Replace(r, @"^\.\\", "");
            return (r);
        }

        static void fileWrite(string fn, string str)
        {
            // ファイルにテキストを書き出し。
            using (StreamWriter w = new StreamWriter(@fn))
            {
                w.Write(str);
            }
        }

        static void makeFile(string fn)
        {
            fileWrite(fn, "");
        }

        static void Main(string[] args)
        {
            bool debug = false;
            bool newone = false; // 新規作成するか?
            for (int i = 0; i < args.Length; i++)
            {
                if (Regex.IsMatch(args[i], @"\-new$", RegexOptions.IgnoreCase) == true)
                {
                    newone = true;
                }
                else if (Regex.IsMatch(args[i], @"\-debug$", RegexOptions.IgnoreCase) == true)
                {
                    debug = true;
                }
                if (debug == true)
                {
                    Console.WriteLine("#..param{0}:{1}", i, args[i]);
                }
            }
            string mnumber = "0";
            string number = "0";
            Hashtable oo = new Hashtable();
            Console.WriteLine(Directory.GetCurrentDirectory());
            foreach (String f in Directory.GetFileSystemEntries("."))
            {
                if (File.GetAttributes(f) == FileAttributes.Directory)
                {
                    //Console.WriteLine("D: {0}", f);
                }
                else
                {
                    //Console.WriteLine("F: {0}", f);
                    string ff = filefilter(f);
                    if(Regex.IsMatch(ff,@"\-\d{1,5}\.txt$", RegexOptions.IgnoreCase) == true){
                        oo[getNovname(ff)] = ff;
                        number = getNumberFromFilename(ff);
                        if (int.Parse(number) > int.Parse(mnumber))
                        {
                            mnumber = number;
                        }
                        if (debug == true)
                        {
                            Console.WriteLine("{0}", ff);
                        }
                    }
                }
            }

            string zp = "";
            foreach (string x in oo.Keys)
            {
                Console.WriteLine("File形式発見: {0}-数字.txt", x);
                zp = x;
            }
            if (oo.Count == 0)
            {
                Console.WriteLine("むむ、「識別名-番号.txt」形式の原稿が存在しないようです。");
            }
            else if (oo.Count > 1)
            {
                Console.WriteLine("おや、それっぽい識別コードが{0}種類あります。問題の元になるので統一すべきかも。", oo.Count);
            }
            else
            {
                string newfile = zp + "-" + (int.Parse(mnumber) + 1).ToString("D3") + ".txt";
                Console.WriteLine("最大値は、{0}です。\n次を作るなら、{1}になります。(-new オプションで作成できます)", mnumber, newfile);
                if (newone == true)
                {
                    Console.WriteLine("新規作成します。{0}",newfile);
                    if (System.IO.File.Exists(newfile) == true)
                    {
                        Console.WriteLine("そのファイル({0})は存在しますので処理中断します。", newfile);
                    }
                    else
                    {
                        makeFile(newfile);
                        Console.WriteLine("新ファイル({0})を作成しました。", newfile);
                    }
                }
            }
            if (debug == true)
            {
                Console.WriteLine("終了です(何かキーをおしてください)");
                Console.ReadKey();
            }
        }
    }
}