파일이 있는지 확인한 후 파일을 삭제하는 방법


220

C:\test.txt배치 파일과 같은 종류의 방법을 적용하지만 C #에서 파일을 어떻게 삭제할 수 있습니까?

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

답변:


388

File 클래스를 사용하면 매우 간단합니다 .

if(File.Exists(@"C:\test.txt"))
{
    File.Delete(@"C:\test.txt");
}


크리스는 의견에서 지적, 당신은 실제로 수행 할 필요가 없습니다 File.Exists이후 확인 File.Delete파일이 존재하지 않는 경우 절대 경로를 사용하는 경우 확인을 위해 검사가 필요하지만, 예외를 throw하지 않습니다 전체 파일 경로가 유효합니다.


13
그 테스트는 실제로 필요하지 않습니다. 내 게시물을 참조하십시오.
Chris Eberle

20
가능한 DirectoryNotFoundException을 방지하려면 테스트가 필요합니다.
Timothy Strimple

7
이 테스트는 예외 처리 대신 사용해서는 안되며 대신 수행해야합니다. 여러 가지 시나리오로 인해 존재 확인이 true를 리턴하고 삭제가 발생합니다.
Josh

1
@파일 경로 앞에 왜 있습니까? 나를 위해 그것은없이 작동합니다.
파스칼 애커 만

5
@를 사용하면 백 슬래시를 두 배로 늘릴 필요가 없습니다.
PRMan

105

System.IO.File.Delete를 다음 과 같이 사용하십시오 .

System.IO.File.Delete(@"C:\test.txt")

설명서에서 :

삭제할 파일이 없으면 예외가 발생하지 않습니다.


7
"지정된 경로가 유효하지 않은 경우 (예 : 매핑되지 않은 드라이브에있는 경우) DirectoryNotFoundException이 발생합니다."
Timothy Strimple

5
얼마나 이상해? Intellisense는 말합니다 An exception is thrown if the specified file does not exist.
fearofawhackplanet

다른 버전의 .NET 프레임 워크를 사용하고 있습니까?
Chris Eberle

1
나는 인텔리 내가 수표를 실행이 잘못 않고, 예외는 throw되지 것 같습니다, .Net4을 사용하고 있습니다
fearofawhackplanet

3
그래 나는 노력하고 System.IO.File.Delete(@"C:\test.txt");충분하다. 감사합니다
Berkay Turancı

34

다음을 System.IO사용 하여 네임 스페이스를 가져올 수 있습니다 .

using System.IO;

파일 경로가 파일의 전체 경로를 나타내는 경우 파일의 존재를 확인하고 다음과 같이 삭제할 수 있습니다.

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  

2
왜 상관없이 Delete 호출을 발행하고 파일이 존재하지 않음을 나타내는 예외를 포착하지 않습니까?
antred

32
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

그러나

System.IO.File.Delete(@"C:\test.txt");

폴더가 존재하는 한 동일하게 수행됩니다.


23

를 피 DirectoryNotFoundException하려면 파일의 디렉토리가 실제로 존재하는지 확인해야합니다. File.Exists이것을 달성합니다. 또 다른 방법은 다음 PathDirectory같이 및 유틸리티 클래스 를 활용하는 것입니다 .

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}

15
  if (System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
    {
        // Use a try block to catch IOExceptions, to 
        // handle the case of the file already being 
        // opened by another process. 
        try
        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine(e.Message);
            return;
        }
    }


1

FileStream을 사용하여 해당 파일에서 읽은 후 삭제하려면 File.Delete (path)를 호출하기 전에 FileStream을 닫아야합니다. 나는이 문제가 있었다.

var filestream = new System.IO.FileStream(@"C:\Test\PutInv.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
File.Delete(@"C:\Test\PutInv.txt");

또는 괄호 밖에 있는 using문장을 사용하십시오 File.Delete(). 당신이 가지고있는 예에서, 당신은 또한해야합니다 filestream.Dispose();.
vapcguy

1

때로는 어떤 경우이든 파일을 삭제하려고합니다 (예외가 발생하면 파일을 삭제하십시오). 그런 상황에.

public static void DeleteFile(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            bool isDeleted = false;
            while (!isDeleted)
            {
                try
                {
                    File.Delete(path);
                    isDeleted = true;
                }
                catch (Exception e)
                {
                }
                Thread.Sleep(50);
            }
        }

참고 : 지정된 파일이 없으면 예외가 발생하지 않습니다.


10
따라서 파일이 삭제 될 때까지 초당 20 회 파일을 삭제하려고합니다. 어떤 이유로 파일을 삭제할 수없고 프로그램이 파일을 영구적으로 삭제하려고하면 어떻게됩니까? 나는 이것이 좋은 해결책이라고 생각하지 않습니다.
kv1dr

2
최소한 시간 종료 매개 변수를 제공해야합니다.
antred

@ kv1dr 맞습니다. 제한된 시간 동안 시도하고 파일이 삭제되지 않은 경우 실패 메시지를 반환해야한다고 생각합니다.
QMaster

0

이것이 가장 간단한 방법입니다.

if (System.IO.File.Exists(filePath)) 
{
  System.IO.File.Delete(filePath);
  System.Threading.Thread.Sleep(20);
}

Thread.sleep 완벽하게 작동하는 데 도움이됩니다. 그렇지 않으면 파일을 복사하거나 쓰면 다음 단계에 영향을줍니다.

내가 한 또 다른 방법은

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.