【C#】指定フォルダに大量のランダムファイル群を作る

//
// 指定フォルダに大量のランダムファイル群を作る
//
// >C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe このファイル.cs
// >このファイル.exe 空フォルダパス [1ファイルのサイズ(1MB)]
//
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        string targetFolder = args[0]; // ターゲットフォルダ
        string fileSizeStr = args.Length > 1 ? args[1] : "1MB"; // 1ファイルサイズ
        
        try
        {
            long fileSizeBytes = ConvertFileSizeToBytes(fileSizeStr);
            CreateFoldersAndFiles(targetFolder, fileSizeBytes);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex.Message);
        }
    }

    static long ConvertFileSizeToBytes(string size)
    {
        var regex = new System.Text.RegularExpressions.Regex(@"(\d+)([KMGT]B)?");
        var match = regex.Match(size);

        if (match.Success)
        {
            int value = int.Parse(match.Groups[1].Value);
            string unit = match.Groups[2].Value.ToUpper();

            switch (unit)
            {
                case "KB": return value * 1024;
                case "MB": return value * 1024 * 1024;
                case "GB": return value * 1024 * 1024 * 1024;
                case "TB": return value * 1024 * 1024 * 1024 * 1024;
                default: return value; // 単位が無い場合はバイト単位として扱う
            }
        }
        else
        {
            throw new ArgumentException("Invalid file size format: " + size);
        }
    }

    static void CreateRandomFile(string filePath, long size)
    {
        string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder data = new StringBuilder();

        while (data.Length < size)
        {
            int chunkSize = (int)Math.Min(10000, size - data.Length);
            for (int i = 0; i < chunkSize; i++)
            {
                data.Append(chars[random.Next(chars.Length)]);
            }
        }

        File.WriteAllText(filePath, data.ToString());
    }

    static string GenerateRandomFileName(int length = 200)
    {
        string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder randomString = new StringBuilder();

        for (int i = 0; i < length; i++)
        {
            randomString.Append(chars[random.Next(chars.Length)]);
        }

        return randomString.ToString();
    }

    static void CreateFoldersAndFiles(string baseFolder, long fileSize)
    {
        try
        {
            if (!Directory.Exists(baseFolder))
            {
                Directory.CreateDirectory(baseFolder);
            }

            for (int i = 0; i < 100; i++)
            {
                string subFolder = Path.Combine(baseFolder, i.ToString("D2"));
                if (!Directory.Exists(subFolder))
                {
                    Directory.CreateDirectory(subFolder);
                }

                for (int j = 0; j < 100; j++)
                {
                    string fileName = GenerateRandomFileName();
                    string filePath = Path.Combine(subFolder, fileName + ".txt");
                    CreateRandomFile(filePath, fileSize);
                }

                // 再帰処理
                CreateFoldersAndFiles(subFolder, fileSize);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex.Message);
            return;
        }
    }
}