2021/04/30(Fri) 14:04:00 編集(投稿者)
こんな感じでどうでしょう。
var TgtDir = Directory.GetCurrentDirectory();
var tgtFiles = new Dictionary<string, FileInfo>();
var allFiles = Directory.EnumerateFiles(TgtDir, "*", SearchOption.AllDirectories).Select(x => new FileInfo(x));
var allFileGrps = allFiles.ToLookup(x => x.Name);
foreach (var files in allFileGrps)
{
int index = 0;
foreach(var file in files)
{
var fname = file.Name;
if (index++ > 0)
{
var fname_head = fname.Substring(0, fname.Length - file.Extension.Length);
fname = string.Format("{0}_{1}.{2}", fname_head, index, file.Extension);
}
tgtFiles.Add(fname, file);
}
}
foreach (var tgtFile in tgtFiles)
{
File.Move(tgtFile.Value.FullName, TgtDir + tgtFile.Key);
}
var allDirs = Directory.EnumerateDirectories(TgtDir, "*", SearchOption.AllDirectories);
foreach(var dir in allDirs.Reverse())
{
Directory.Delete(dir);
}
EnumerateDirectories(), EnumerateFiles() は SearchOption.AllDirectories でフォルダ下
まとめて取得です。
あと、ToLookup()がミソです。
https://mk.hatenablog.jp/entry/20090729/1248834368