본문 바로가기
C#

C#] Path의 File, Directory 여부 확인

by Fastlane 2024. 1. 5.
728x90
반응형

path가 file인지 directory인지 결정하는 방법을 살펴보자.

2가지 방법이 있다. 첫번째는 path가 file 또는 directory로 존재하는지 확인한다. 두번째는 path의 attribute를 확인한다. 

 

Directory, File 존재여부 확인

.NET에는 2쌍의 클래스가 있다. File과 Directory가 있고, FileInfo와 DirectoryInfo가 있다. 

File 함수는 FileInfo 함수와 비슷하고, Directory함수는 DirectoryInfo 함수와 비슷하다. 

 

Directory에서 file을 구분하는데 이 클래스들이 어떻게 사용되는지 보자. 

 

Directory와 File 클래스의 사용

File와 Directory는 static class이다. 둘다 Exists() 함수를 갖는다. 

 

File.Exists() 는 path가 file로 존재하는지 체크하고 true를 반환한다. Directory.Exists()는 test_file.abc가 directory로 존재하는지 체크하고 false를 반환한다. 

 

var testFile = Path.Combine(Path.GetTempPath(), "test_file.abc");
File.CreateText(testFile);

bool isFile = File.Exists(testFile);
bool isDirectory = Directory.Exists(testFile);

Directory로 다시 해보자. 

var testDirectory = Path.Combine(Path.GetTempPath(), "test_directory");
Directory.CreateDirectory(testDirectory);

bool isFile = File.Exists(testDirectory);
bool isDirectory = Directory.Exists(testDirectory);

directory도 file도 아닌 것으로 해보자. 

var notExistingPath = "someNotExistingPath";

bool isFile = File.Exists(notExistingPath);
bool isDirectory = Directory.Exists(notExistingPath);

File.Exists(), Directory.Exists()로 path가 파일인지 directory인지 둘다 아닌지 확인할 수 있다. DirectoryInfo와 FileInfo로도 동일하게 확인해보자. 

 

DirectoryInfo와 FileInfo 클래스의 사용

static class가 아니다 instance를 생성하고 path를 constructor에 전달해야 한다. FileInfo, DirectoryInfo 사용 시, 파일 접근과 보안을 object 생성 시 최초 한번만 확인한다. path operation이 많으면 FileInfo와 DirectoryInfo가 더 편리하다. 

 

cache information때문에 사용 시, 주의해야 한다. file 생성 이전에 FileInfo instance를 생성하면, Exists property는 file 생성 후에도 false를 반환한다. Refresh() 함수를 사용해서 이러한 오류를 피한다. 

var testFile = Path.Combine(Path.GetTempPath(), "test_file2.abc");
File.CreateText(testFile);

var fileInfo = new FileInfo(testFile);
var directoryInfo = new DirectoryInfo(testFile);

bool isFile = fileInfo.Exists;
bool isDirectory = directoryInfo.Exists;

isFile은 true이고, isDirectory는 false이다. 

 

var testDirectory = Path.Combine(Path.GetTempPath(), "test_directory2");
Directory.CreateDirectory(testDirectory);

var fileInfo = new FileInfo(testDirectory);
var directoryInfo = new DirectoryInfo(testDirectory);

bool isFile = fileInfo.Exists; 
bool isDirectory = directoryInfo.Exists;

isFile은 false 이고, isDirectory는 true이다. 

 

var notExistingPath = "someNotExistingPath2";

var fileInfo = new FileInfo(notExistingPath);
var directoryInfo = new DirectoryInfo(notExistingPath);

bool isFile = fileInfo.Exists; 
bool isDirectory = directoryInfo.Exists;

둘 다 false이다. 

 

FileAttributes 사용

FileAttributes enum은 path에 대한 정보(예를들어, 파일인지 directory인지)를 제공한다. 만약에 hidden, read-only, compressed 다른 경우에도, FileAttributes Enum을 확인하여 상세정보를 알 수 있다. 

 

var testFile = Path.Combine(Path.GetTempPath(), "test_file4.abc");
File.CreateText(testFile);

var attributes = File.GetAttributes(testFile);

isDirectory = attributes.HasFlag(FileAttributes.Directory);
isFile = !isDirectory;

만약에 path가 존재한다면, FileAttributes.Directory flag는 path가 directory라는 말이다. flag가 없다면  path는 file이다. 

path가 존재하지 않으면, File.GetAttributes()는 FileNotFoundException을 던진다. 

 

var notExistingPath = "someNotExistingPath4";

bool isFile;
bool isDirectory;
try
{
    var attributes = File.GetAttributes(notExistingPath);
    isDirectory = attributes.HasFlag(FileAttributes.Directory);
    isFile = !isDirectory;
}
catch (FileNotFoundException)
{
    isFile = isDirectory = false;
}
728x90
반응형

댓글