카테고리 없음

디렉터리 안의 어떤 내용이 없는 파일들 지우기

hyuckkim 2021. 10. 24. 22:51

라는 기능이 필요해져서 (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 이상이면 실행되지 않을까요?