Bir dosyanın var olup olmadığını kontrol ettikten sonra nasıl silinir


220

Örneğin C:\test.txt, toplu iş dosyalarında olduğu gibi aynı tür yöntemi uygulasa da , C # 'daki bir dosyayı nasıl silebilirim?

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Yanıtlar:


388

File sınıfını kullanmak oldukça basittir .

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


Chris'in belirttiği gibi , dosya yoksa bir istisna atmadığı için aslında File.Existskontrolü yapmanız gerekmez File.Delete, ancak mutlak yollar kullanıyorsanız, emin olmak için kontrole ihtiyacınız olacaktır. tüm dosya yolu geçerlidir.


13
Bu test aslında gerekli değil. Yayına bakın.
Chris Eberle

20
Olası bir DirectoryNotFoundException durumunu önlemek istiyorsanız sınama gereklidir.
Timothy Strimple

7
Test, istisna işlemesi yerine kullanılmamalıdır, bunun yerine iletimde kullanılmalıdır. Herhangi bir sayıda senaryo, var olan çekin doğru dönmesine ve Silme işlemini atmasına neden olabilir.
Josh

1
@Dosya yolundan önce neden var ? Benim için olmadan çalışır.
Pascal Ackermann

5
@ ters eğik çizgileri ikiye katlamak zorunda kalmaz.
PRMan

105

System.IO.File.Delete'ı şu şekilde kullanın :

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

Belgelerden:

Silinecek dosya mevcut değilse, herhangi bir istisna atılmaz.


7
Bu, "Belirtilen yol geçersizse (örneğin, eşlenmemiş bir sürücüde ise)" bir DirectoryNotFoundException oluşturur.
Timothy Strimple

5
Ne kadar garip. Intellisense diyor An exception is thrown if the specified file does not exist.
fearofawhackplanet

Belki de .NET çerçevesinin farklı bir sürümünü kullanıyorsunuz?
Chris Eberle

1
Net4 kullanıyorum, zekâ yanlış gibi görünüyor Bir kontrol çalıştırdım ve istisna yok
fearofawhackplanet 23:11

3
Evet denedim ve System.IO.File.Delete(@"C:\test.txt");yeter. Teşekkürler
Berkay Turancı

34

System.IOAd alanını aşağıdakileri kullanarak içe aktarabilirsiniz :

using System.IO;

Dosya yolu dosyanın tam yolunu temsil ediyorsa, varlığını kontrol edebilir ve aşağıdaki gibi silebilirsiniz:

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

2
Neden sadece aramayı silmek istemiyorsanız ve dosyanın mevcut olmadığını belirten bir istisna yakalamıyorsunuz?
antred

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

fakat

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

klasör olduğu sürece aynı işlemi yapar.


23

Birinden kaçınmak DirectoryNotFoundExceptionistiyorsanız, dosya dizininin gerçekten var olduğundan emin olmanız gerekir. File.Existsbunu başarır. Başka bir yol, Pathve Directoryyardımcı sınıflarını şu şekilde kullanmak olacaktır :

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 kullanarak bu dosyadan okuyup silmek istiyorsanız, File.Delete (yol) öğesini çağırmadan önce FileStream'i kapattığınızdan emin olun. Bu sorunu yaşadım.

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");

Veya parantezlerin dışına çıkacağı bir usingifade kullanın File.Delete(). Sahip olduğunuz örnekte ayrıca bir filestream.Dispose();.
vapcguy

1

Bazen ne olursa olsun bir dosyayı silmek istersiniz (istisna ne olursa olsun, lütfen dosyayı silin). Bu gibi durumlar için.

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);
            }
        }

Not: Belirtilen dosya yoksa bir istisna atılmaz.


10
Yani dosyayı silinene kadar saniyede 20 kez silmeye çalışıyorsunuz. Herhangi bir nedenle dosya silinemezse ve program dosyayı sonsuza kadar silmeye çalışırsa ne olur? Bunun iyi bir çözüm olduğunu düşünmüyorum.
kv1dr

2
En azından bir zaman aşımı parametresi sağlamalısınız.
antred

@ kv1dr doğru. Dosya silinmemişse, sınırlı bir süre için denemeniz ve bir hata mesajı döndürmeniz gerektiğini düşünüyorum.
QMaster

0

Bu en basit yol olacak,

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

Thread.sleep mükemmel çalışmaya yardımcı olur, aksi takdirde, dosyayı kopyalar veya yazarsak bir sonraki adımı etkiler.

Yaptığım başka bir yol,

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.