라는 기능이 필요해져서 (Language_en_US가 있는 언어 지원용 파일만 남기고 나머지 다 지우려고) 파워쉘로 어떻게 해보려고 찾아보고 있었는데...
아! 나 C# 할 줄 알았지!
C#로 간단하게 만들었습니다.
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
namespace AnyRemover
{
public class Program
{
static string path = string.Empty;
static string query = string.Empty;
public static void Main()
{
Console.Write("Input path : ");
var newpath = Console.ReadLine();
if (newpath == null)
{
throw new ArgumentNullException();
}
path = newpath;
Console.Write("Input query : ");
var newquery = Console.ReadLine();
if (newquery == null)
{
throw new ArgumentNullException();
}
query = newquery;
DirectoryInfo dir = new(path);
if (dir.Exists)
{
SearchDirectory(dir);
}
}
static void SearchDirectory(DirectoryInfo info)
{
foreach (DirectoryInfo dir in info.GetDirectories())
{
SearchDirectory(dir);
}
foreach (FileInfo file in info.GetFiles())
{
DestroybyQuery(file);
}
if (info.GetDirectories().Length + info.GetFiles().Length == 0)
{
Console.WriteLine($"{info.FullName} removed.");
info.Delete();
}
}
static void DestroybyQuery(FileInfo info)
{
StreamReader reader = info.OpenText();
string? line;
while (true)
{
line = reader.ReadLine();
if (line == null) break;
if (line.Contains(query))
{
reader.Close();
return;
}
}
reader.Close();
Console.WriteLine($"{info.FullName} removed.");
info.Delete();
}
}
}
Main : 경로와 대상 문자를 받습니다. 대상 문자라는 이름이 안 떠올라서 그냥 query로 이름을 만들었습니다.
SearchDictionary : 디렉터리의 모든 폴더에 대해 SearchDictionary를 실행하고 모든 파일에 각각 query가 포함되어 있는지 검사하는 재귀 메서드. 디렉터리에 폴더랑 파일이 하나도 없으면 디렉터리를 지웁니다.
DestroybyQuery : 파일을 텍스트 파일로 줄별로 읽으면서 모든 줄을 다 읽었는데도 그 내용이 없으면 지우기. 중간에 그 내용이 나오면 통과 (return)
.Net 6.0, Visual studio 2022 Preview에서 실행하긴 했는데 C# 9 이상이면 실행되지 않을까요?