Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 파일과 디렉토리 본문

Programming/C#

[Programming/C#] 파일과 디렉토리

scii 2020. 9. 27. 22:05

파일(File)은 컴퓨터 저장 매체에 기록되는 데이터의 묶음이다. 디렉토리(Directory)는 파일이 위치하는 주소로, 파일(서류)를 담는다는 의미에서 폴더(Folder)라고 부르기도 한다. .NET 프레임워크에서는 파일과 데릭테뢰 정보를 손쉽게 다룰 수 있도록 System.IO 네임스페이스 아래에 다음과 같은 클래스들을 제공한다.

클래스 설명
File 파일의 생성, 복사, 삭제, 이동, 조회를 처리하는 정적 메소드를 제공한다.
FileInfo File 클래스와 하는 일은 동일하지만 정적 메소드 대신 인스턴스 메소드를 제공한다.
Directory 디렉토리의 생성, 삭제, 이동, 조회를 처리하는 정적 메소드를 제공한다.
DirectoryInfo Directory 클래스와 하는 일은 동일하지만 정적 메소드 대신 인스턴스 메소드를 제공한다.

File 클래스와 FileInfo 클래스는 거의 같은 기능을 제공한다. 차이라면 File 클래스는 같은 기능을 정적 메소드를 통해 제공하고 FileInfo 클래스는 인스턴스 메소드를 통해 제공한다는 점뿐이다. 어떤 경우에 File 클래스와 FileInfo 클래스 중 어느 것을 사용해야 한다는 규칙 같은 것은 없지만, 하나의 파일에 대해 한두 가지 정도의 작업을 할 때는 File 클래스의 정적 메소드를 이용하고, 하나의 파일에 여러 작업을 수행할 때에는 FileInfo 클래스의 인스턴스 메소드를 이용하는 편이다.
Directory 클래스와 DirectoryInfo 클래스에 대해서도 마찬가지이다. 디렉토리에 대해 한 두 가지 작업을 해야 할 때는 Directory 클래스를, 여러 가지 작업을 해야 할 때는 DirectoryInfo 클래스를 이용하면 된다.

아래의 표에는 File 클래스와 FileInfo 클래스, Directory 클래스와 DirectoryInfo 클래스가 제공하는 주요 메소드와 프로퍼티가 정리되어 있다. 이들은 파일/디렉토리 작업에 있어 핵심이라 할 수 있는 생성/복사/삭제/이동/정보 조회 등의 기능을 수행한다.

기능 File FileInfo Directory DirectoryInfo
생성 Create() Create() CreateDirectory() Create()
복사 Copy() CopyTo() - -
삭제 Delete() Delete() Delete() Delete()
이동 Move() MoveTo() Move() MoveTo()
존재 여부 확인 Exists() Exists Exists() Exists
속성 조회  GetAttributes() Attributes GetAttributes() Attributes
하위 디렉토리 조회 - - GetDirectories() GetDirectories()
하위 파일 조회 - - GetFiles() GetFiles()

File 클래스와 FileInfo 클래스

기능 File FileInfo
생성 FileStream fs = File.Create("a.dat"); FileInfo file = new FileInfo("a.dat");
FileStream fs = file.Create();
복사 File.Copy("a.dat", "b.dat"); FileInfo src = new FileInfo("a.dat");
FileInfo dst = src.CopyTo("b.dat");
삭제 File.Delete("a.dat"); FileInfo file = new FileInfo("a.dat");
file.Delete();
이동 File.Move("a.dat", "b.dat"); FileInfo file = new FileInfo("a.dat");
file.MoveTo("b.dat");
존재 여부 확인 if (File.Exists("a.dat"))
    // ...
FileInfo file = new FileInfo("a.dat");
if (file.Exists)
    // ...
속성 조회 File.GetAttributes("a.dat"); FileInfo file = new FileInfo("a.dat");
file.Attributes;

Directory 클래스와 DirectoryInfo 클래스

기능 Directory DirectoryInfo
생성 DirectoryInfo dir = Directory.CreateDirectory("a"); DirectoryInfo dir = new DirectoryInfo("a");
dir.Create();
삭제 Directory.Delete("a"); DirectoryInfo dir = new DirectoryInfo("a");
이동 Directory.Move("a", "b"); DirectoryInfo dir = new DirectoryInfo("a");
dir.MoveTo("b");
존재 여부 확인 if (Directory.Exists("a.dat"))
    // ...
DirectoryInfo dir = new DirectoryInfo("a");
if (dir.Exists)
  // ...
속성 조회 Directory.GetAttributes("a"); DirectoryInfo dir = new DirectoryInfo("a");
dir.Attributes;
하위 디렉토리 조회 string [] dirs = Directory.GetDirectories("a"); DirectoryInfo dir = new DirectoryInfo("a");
DirectoryInfo[] dirs = dir.GetDirectories();
하위 파일 조회 string[] files = Directory.GetFiles("a"); DirectoryInfo dir = new DirectoryInfo("a");
FileInfo[] files = dir.GetFiles();

디렉토리/파일 정보 조회 예제

using System;
using System.Linq;
using System.IO;

namespace CSharpExample
{
    internal class MainApp
    {
        static int Main(string[] args)
        {
            string directory;
            if (args.Length < 1)
                directory = ".";
            else
                directory = args[0];

            Console.WriteLine($"{directory} directory info");
            Console.WriteLine("- Directories :");

            var directories = (from dir in Directory.GetDirectories(directory)
                               let info = new DirectoryInfo(dir)
                               select new
                               {
                                   Name = info.Name,
                                   Attributes = info.Attributes
                               }).ToList();

            foreach(var d in directories)
                Console.WriteLine($"{d.Name} : {d.Attributes}");

            Console.WriteLine("- Files :");

            var files = (from file in Directory.GetFiles(directory)
                         let info = new FileInfo(file)
                         select new
                         {
                             Name = info.Name,
                             FileSize = info.Length,
                             Attributes = info.Attributes
                         }).ToList();

            foreach(var f in files)
                Console.WriteLine($"{f.Name} : {f.FileSize}, {f.Attributes}");

            return 0;
        }
    }
}


/* 결과

. directory info
- Directories :
- Files :
HelloWorld.exe : 10752, Archive
HelloWorld.exe.config : 189, Archive
HelloWorld.pdb : 22016, Archive
System.ValueTuple.dll : 25232, Archive
System.ValueTuple.xml : 142, Archive

*/

디렉토리/파일 생성 예제

using System;
using System.IO;

namespace CSharpExample
{
    internal class MainApp
    {
        static void OnWrongPathType(string type)
        {
            Console.WriteLine($"{type} is wrong type");
            return;
        }

        static int Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("usage: Touch.exe <Path> [Type:File/Directory]");
                return 1;
            }

            string path = args[0];
            string type = "File";
            if (args.Length > 1)
                type = args[1];

            if (File.Exists(path) || Directory.Exists(path))
            {
                if (type == "File")
                    File.SetLastWriteTime(path, DateTime.Now);
                else if (type == "Directory")
                    Directory.SetLastWriteTime(path, DateTime.Now);
                else
                {
                    OnWrongPathType(path);
                    return 1;
                }
                Console.WriteLine($"Updated {path} {type}");
            }
            else
            {
                if (type == "File")
                    File.Create(path).Close();
                else if (type == "Directory")
                    Directory.CreateDirectory(path);
                else
                {
                    OnWrongPathType(path);
                    return 1;
                }
                Console.WriteLine($"Created {path} {type}");
            }

            return 0;
        }
    }
}
Comments