.NET Framework
System.IO.File 클래스
수색…
통사론
- 문자열 소스;
- 문자열 목적지;
매개 변수
매개 변수 | 세부 |
---|---|
source | 다른 위치로 이동할 파일입니다. |
destination | source 를 이동할 디렉토리 (이 변수에는 파일의 이름 (및 파일 확장자)도 포함되어야 함). |
파일 삭제
파일을 삭제하려면 (필요한 권한이있는 경우) 다음과 같이 간단합니다.
File.Delete(path);
그러나 많은 일이 잘못 될 수 있습니다.
- 필요한 권한이 없습니다 (
UnauthorizedAccessException
이 Throw됩니다). - 파일이 다른 사람에 의해 사용 중일 수 있습니다 (
IOException
이 발생합니다). - 저수준 오류로 인해 파일을 삭제할 수 없거나 미디어가 읽기 전용 (
IOException
이 발생 함)으로 삭제할 수 없습니다. - 파일이 더 이상 존재하지 않습니다 (
IOException
이 발생합니다).
마지막 점 (파일이 존재하지 않음)은 일반적으로 다음과 같은 코드 스 니펫으로 피할 수 있습니다.
if (File.Exists(path))
File.Delete(path);
그러나 그것은 원자 작업이 아니다 및 파일에 대한 호출 사이에 다른 사람에 의해 삭제 될 수 있습니다 File.Exists()
및 전 File.Delete()
. I / O 작업을 처리하는 올바른 방법은 예외 처리가 필요합니다 (작업이 실패 할 때 대체 작업 과정이 취해질 수 있다고 가정).
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException exception)
{
if (!File.Exists(path))
return; // Someone else deleted this file
// Something went wrong...
}
catch (UnauthorizedAccessException exception)
{
// I do not have required permissions
}
}
이 I / O 오류는 일시적 (예 : 사용중인 파일)이며 네트워크 연결이 관련된 경우 자동으로 복구 할 수 있습니다. 그런 다음 각 시도 사이에 약간의 지연을두고 I / O 작업을 몇 번 다시 시도 하는 것이 일반적입니다.
public static void Delete(string path)
{
if (!File.Exists(path))
return;
for (int i=1; ; ++i)
{
try
{
File.Delete(path);
return;
}
catch (IOException e)
{
if (!File.Exists(path))
return;
if (i == NumberOfAttempts)
throw;
Thread.Sleep(DelayBetweenEachAttempt);
}
// You may handle UnauthorizedAccessException but this issue
// will probably won't be fixed in few seconds...
}
}
private const int NumberOfAttempts = 3;
private const int DelayBetweenEachAttempt = 1000; // ms
참고 : Windows 환경 파일에서는이 함수를 호출 할 때 실제로 삭제되지 않습니다. 누군가 다른 사람이 FileShare.Delete
를 사용하여 파일을 열면 파일을 삭제할 수 있지만 소유자가 파일을 닫을 때만 효과적으로 발생합니다.
텍스트 파일에서 원치 않는 줄 제거
텍스트 파일을 변경하려면 콘텐츠를 이동해야하기 때문에 쉽지 않습니다. 작은 파일의 경우 가장 쉬운 방법은 내용을 메모리에서 읽은 다음 수정 된 텍스트를 다시 쓰는 것입니다.
이 예제에서 우리는 파일에서 모든 라인을 읽고 모든 빈 줄을 버린 다음 원래 경로에 다시 씁니다.
File.WriteAllLines(path,
File.ReadAllLines(path).Where(x => !String.IsNullOrWhiteSpace(x)));
파일이 너무 커서 메모리에로드 할 수없고 출력 경로가 입력 경로와 다른 경우
File.WriteAllLines(outputPath,
File.ReadLines(inputPath).Where(x => !String.IsNullOrWhiteSpace(x)));
텍스트 파일 인코딩 변환
텍스트가 인코딩 된 상태로 저장되고 ( 문자열 항목을 참조하십시오) 인코딩을 변경해야 할 수도 있습니다.이 예제에서는 파일이 너무 크지 않고 완전히 메모리에서 읽을 수 있다고 가정합니다 (단순함을 위해).
public static void ConvertEncoding(string path, Encoding from, Encoding to)
{
File.WriteAllText(path, File.ReadAllText(path, from), to);
}
변환을 수행 할 때 파일에 BOM (Byte Order Mark)이 포함되어있어 관리 방법을 더 잘 이해할 수 있다는 것을 잊지 마십시오. Encoding.UTF8.GetString은 Preamble / BOM을 고려하지 않습니다 .
많은 양의 파일을 "터치"(마지막 쓰기 시간을 업데이트)
이 예제는 많은 수의 파일의 마지막 쓰기 시간을 업데이트합니다 ( System.IO.Directory.GetFiles()
대신 System.IO.Directory.EnumerateFiles
사용). 선택적으로 검색 패턴을 지정할 수 있습니다 (기본값은 "*.*"
이며 결국 지정된 디렉토리뿐만 아니라 디렉토리 트리를 통해 검색합니다).
public static void Touch(string path,
string searchPattern = "*.*",
SearchOptions options = SearchOptions.None)
{
var now = DateTime.Now;
foreach (var filePath in Directory.EnumerateFiles(path, searchPattern, options))
{
File.SetLastWriteTime(filePath, now);
}
}
지정된 양보다 오래된 파일을 열거하십시오.
이 스 니펫은 지정된 시간보다 오래된 모든 파일을 열거하는 도우미 함수입니다. 예를 들어 이전 로그 파일이나 오래된 캐시 된 데이터를 삭제해야 할 때 유용합니다.
static IEnumerable<string> EnumerateAllFilesOlderThan(
TimeSpan maximumAge,
string path,
string searchPattern = "*.*",
SearchOption options = SearchOption.TopDirectoryOnly)
{
DateTime oldestWriteTime = DateTime.Now - maximumAge;
return Directory.EnumerateFiles(path, searchPattern, options)
.Where(x => Directory.GetLastWriteTime(x) < oldestWriteTime);
}
이렇게 사용 :
var oldFiles = EnumerateAllFilesOlderThan(TimeSpan.FromDays(7), @"c:\log", "*.log");
몇 가지 유의 사항 :
- 검색 사용하여 수행됩니다
Directory.EnumerateFiles()
대신Directory.GetFiles()
. 열거 형은 살아있다. 그러면 모든 파일 시스템 엔트리가 페치 될 때까지 기다릴 필요가 없다. - 마지막 쓰기 시간을 확인하고 있지만 생성 시간 또는 마지막 액세스 시간을 사용할 수 있습니다 (예 : 사용하지 않은 캐시 파일을 삭제할 때 액세스 시간이 비활성화 될 수 있음).
- 세분성이 모든 속성 (쓰기 시간, 액세스 시간, 생성 시간)에 대해 동일하지 않은 경우 MSDN에서 이에 대한 자세한 내용을 확인하십시오.
한 위치에서 다른 위치로 파일 이동
File.Move
한 위치에서 다른 위치로 파일을 이동하려면 간단한 코드 행을 사용하면됩니다. File.Move(@"C:\TemporaryFile.txt", @"C:\TemporaryFiles\TemporaryFile.txt");
그러나이 간단한 조작으로 잘못 될 수있는 많은 것들이 있습니다. 예를 들어, 프로그램을 실행하는 사용자에게 'C'라고 표시된 드라이브가없는 경우 어떻게해야합니까? 만약 그들이했다면 -하지만 그들은 그것을 'B'또는 'M'으로 이름을 바꾸기로 결정 했습니까?
소스 파일 (이동하려는 파일)이 모르게 이동되었거나 단순히 존재하지 않는 경우 어떻게됩니까?
소스 파일의 존재 여부를 먼저 확인하여이를 피할 수 있습니다.
string source = @"C:\TemporaryFile.txt", destination = @"C:\TemporaryFiles\TemporaryFile.txt";
if(File.Exists("C:\TemporaryFile.txt"))
{
File.Move(source, destination);
}
그러면 바로 그 순간에 파일이 존재하고 다른 위치로 이동할 수 있습니다. File.Exists
대한 간단한 호출로는 충분하지 않을 수도 있습니다. 그렇지 않으면 작업을 실패했음을 사용자에게 다시 확인하거나 예외를 처리하십시오.
FileNotFoundException
만이 발생하는 유일한 예외는 아닙니다.
가능한 예외에 대해서는 아래를 참조하십시오.
예외 유형 | 기술 |
---|---|
IOException | 파일이 이미 있거나 소스 파일을 찾을 수 없습니다. |
ArgumentNullException | Source 및 / 또는 Destination 매개 변수의 값이 null입니다. |
ArgumentException | 원본 및 / 또는 대상 매개 변수의 값이 비어 있거나 잘못된 문자가 포함되어 있습니다. |
UnauthorizedAccessException | 이 작업을 수행하는 데 필요한 권한이 없습니다. |
PathTooLongException | 소스, 대상 또는 지정된 경로가 최대 길이를 초과합니다. Windows에서 경로 길이는 248 자 미만이어야하며 파일 이름은 260 자 미만이어야합니다. |
DirectoryNotFoundException | 지정한 디렉토리를 찾을 수 없습니다. |
NotSupportedException | 원본 또는 대상 경로 또는 파일 이름의 형식이 잘못되었습니다. |