일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구조체
- c# 추상 클래스
- jupyter lab
- 유니티
- Houdini
- c# 윈폼
- git
- docker
- 도커
- 플러터
- C++
- C언어 포인터
- Python
- dart 언어
- jupyter
- C# delegate
- c언어
- github
- 깃
- gitlab
- 다트 언어
- 포인터
- Unity
- vim
- Algorithm
- Data Structure
- c# winform
- HTML
- Flutter
- c#
- Today
- Total
nomad-programmer
[Programming/C#] 파일과 디렉토리 본문
파일(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;
}
}
}
'Programming > C#' 카테고리의 다른 글
[Programming/C#] BinaryWriter / BinaryReader (바이너리 파일 처리) (0) | 2020.09.28 |
---|---|
[Programming/C#] 스트림 (Stream) (0) | 2020.09.28 |
[Programming/C#] 동적 언어와의 상호 운용성을 위한 dynamic 형식 (1) | 2020.09.27 |
[Programming/C#] COM (Component Object Model) (0) | 2020.09.27 |
[Programming/C#] dynamic 형식 (0) | 2020.09.26 |