ファイルが存在するかどうかを確認した後にファイルを削除する方法


220

C#などC:\test.txtでファイルを削除するにはどうすればよいですか。

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たファイルが存在しない場合は、絶対パスを使用している場合は、確認するためにチェックが必要になりますが、例外をスローしませんファイルパス全体が有効です。


13
そのテストは実際には必要ありません。私の投稿を参照してください。
Chris Eberle

20
可能性のあるDirectoryNotFoundExceptionを防止したい場合は、テストが必要です。
Timothy Strimple

7
このテストは、例外処理の代わりに使用するのではなく、テストと一緒に使用する必要があります。どのようなシナリオでも、existsチェックがtrueを返し、Deleteがスローされる可能性があります。
Josh

1
@ファイルパスの前になぜあるのですか?私にとってはそれなしで動作します。
Pascal Ackermann

5
@を使用すると、バックスラッシュを2倍にする必要がなくなります。
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 2011

おそらく、.NETフレームワークの別のバージョンを使用していますか?
Chris Eberle 2011

1
私は.Net4を使用していますが、インテリセンスが間違っているようです。チェックを実行したところ、例外がスローされませんでした
fearofawhackplanet

3
ええ、私は試しただけSystem.IO.File.Delete(@"C:\test.txt");で十分です。ありがとう
BerkayTurancı12年

33

System.IOを使用して名前空間をインポートできます。

using System.IO;

filepathがファイルへのフルパスを表す場合は、その存在を確認し、次のように削除できます。

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

2
とにかく単にDelete呼び出しを発行し、ファイルが存在しないことを示す例外をキャッチしないのはなぜですか?
18年

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これを達成します。もう1つの方法は、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 2017年

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
したがって、ファイルが削除されるまで、1秒あたり20回ファイルを削除しようとしています。何らかの理由でファイルを削除できず、プログラムがそれを永久に削除しようとするとどうなりますか?これは良い解決策ではないと思います。
kv1dr 2018

2
少なくとも、タイムアウトパラメータを指定する必要があります。
18年

@ 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.