본문 바로가기

공방/학습 일지

[ .NET ] File 및 Directory 작업 활용2

특정 확장자를 가진 파일 찾기

검색할 폴더명을 "directory1"에 입력하고, 찾고자 하는 확장자를 ".txt"에 입력

ex1)  (extension == ".txt") , (extension == ".ppt") , (extension == ".cs")

지정한 확장자를 가진 모든 파일을 찾아 보여준다

using System;
using System.IO;
using System.Collections.Generic;

namespace dev_butterflylifExam
{
    class Program
    {
        static void Main(string[] args)
        {
            var currentDirectory = Directory.GetCurrentDirectory();
            var storesDirectory = Path.Combine(currentDirectory, "directory1");

            var salesFiles = FindFiles(storesDirectory);

            foreach (var file in salesFiles)
            {
                Console.WriteLine(file);
            }
        }

        static IEnumerable<string> FindFiles(string folderName)
        {
            List<string> salesFiles = new List<string>();

            var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);

            foreach (var file in foundFiles)
            {
                var extension = Path.GetExtension(file);

                if (extension == ".txt")
                    salesFiles.Add(file);
            }
            return salesFiles;
        }
    }
}

output : /home/프로젝트 위치/directory1/test.txt

 

디렉터리 만들기

현재 프로젝트 폴더를 기준으로 입력한 폴더("폴더1", "폴더2", ...) 를 생성해 준다

Combine은 string[] 형태로 인수를 받아 최대 

Directory.CreateDirectory(Path.Combine(Directory.GetCurrentDirectory(), "폴더1","폴더2"));

 

디렉터리 확인

디렉터리 유무를 확인

bool doesDirectoryExists = Directory.Exists(filePath);

 

파일 만들기

원하는 파일명을 "파일명.txt"에 입력하고, "내용"에 원하는 내용 입력

File.WriteAllText(Path.Combine(Directory.GetCurrentDirectory(), "파일명.txt"), "내용");

 

파일에서 데이터 읽기

File.ReadAllText($"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales.json");

output : 
{
  "total": 22385.32
}

 

파일의 데이터 구문 분석 패키지 (Json.NET 추가)

Json 구문 분석 패키지인 Newtonsoft.Json 를 설치

Json Parsor 역할로 사용한다

다른 파일 형식을 구문 분석해야 하는 경우 nuget.org 에서 찾을수 있다

예를 들어 .csv 파일은 CsvHelper 패키지가 있다

dotnet add package Newtonsoft.Json
using Newtonsoft.Json;

class SalesTotal
{
  public double Total { get; set; }
}

var data 
	= JsonConvert.DeserializeObject<SalesTotal>
    	($"stores{Path.DirectorySeparatorChar}
           201{Path.DirectorySeparatorChar}
           sales.json");

Console.WriteLine(data.Total);

 

파일에 데이터 쓰기

var data 
	= JsonConvert.DeserializeObject<SalesTotal>
    	($"stores{Path.DirectorySeparatorChar}
           201{Path.DirectorySeparatorChar}
           sales.json");

File.WriteAllText($"SalesTotals{Path.DirectorySeparatorChar}totals.txt", data.Total.ToString());

// totals.txt
// 22385.32

 

파일에 데이터 추가

var data = JsonConvert.DeserializeObject<SalesTotal>
		($"stores{Path.DirectorySeparatorChar}
        201{Path.DirectorySeparatorChar}
        sales.json");

File.AppendAllText($"SalesTotals{Path.DirectorySeparatorChar}totals.txt", 
		   $"{data.Total}{Environment.NewLine}");

// totals.txt
// 22385.32
// 22385.32

 

파일의 값을 읽어 합계를 출력하는 기능 구현

파일 생성, 읽기, 쓰기, 찾기, Parsor 등의 기능을 조합하여 합계 출력 기능을 구현

쓰기를 반복할 경우 totals.txt 파일에 덮어쓰기가 아닌 이어쓰기를 한다

"directory1" 폴더가 없을 경우 오류가 발생하므로, 폴더를 생성해주거나 예외처리를 해줘야 한다

 

실행 순서는 다음과 같다

1. 프로젝트 경로 확인

2. 데이터가 들어있는 폴더와 프로젝트 경로를 Combine

3. 결과를 저장할 폴더를 프로젝트 경로와 Combine

4. 결과를 저장할 폴더를 생성

5. FindFiles 함수로 데이터를 불러와 반환

6. CalculateSalesTotal 함수로 불러온 데이터를 모두 합산

7. 합산한 데이터를 totals.txt 파일에 쓰기(파일이 없으면 생성한 후 쓰기)

using System;
using System.IO;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace dev_butterflylifeExam
{
    class Program
    {
        static void Main(string[] args)
        {
            var currentDirectory = Directory.GetCurrentDirectory();            
            var storesDirectory = Path.Combine(currentDirectory, "directory1");

            var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
            Directory.CreateDirectory(salesTotalDir);            

            var salesFiles = FindFiles(storesDirectory);

            var salesTotal = CalculateSalesTotal(salesFiles);

            File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), 
            					$"{salesTotal}{Environment.NewLine}");
        }

        static IEnumerable<string> FindFiles(string folderName)
        {
            List<string> salesFiles = new List<string>();

            var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);

            foreach (var file in foundFiles)
            {
                var extension = Path.GetExtension(file);

                if (extension == ".json")
                {
                    salesFiles.Add(file);
                }
            }

            return salesFiles;
        }

        static double CalculateSalesTotal(IEnumerable<string> salesFiles)
        {
            double salesTotal = 0;

            foreach (var file in salesFiles)
            {      
                string salesJson = File.ReadAllText(file);
                SalesData data = JsonConvert.DeserializeObject<SalesData>(salesJson);
                salesTotal += data.Total;
            }
            return salesTotal;
        }

        class SalesData
        {
            public double Total { get; set; }
        }

    }
}