수색…


통사론

  • 문자열 소스;
  • 문자열 목적지;

매개 변수

매개 변수 세부
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 원본 또는 대상 경로 또는 파일 이름의 형식이 잘못되었습니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow