วิธีลบไฟล์หลังจากตรวจสอบว่ามีอยู่หรือไม่


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


ดังที่Chrisชี้ให้เห็นในความคิดเห็นคุณไม่จำเป็นต้องทำการFile.Existsตรวจสอบจริง ๆเนื่องจากFile.Deleteจะไม่ส่งข้อยกเว้นหากไฟล์ไม่มีอยู่แม้ว่าคุณจะใช้พา ธ สัมบูรณ์คุณจะต้องตรวจสอบเพื่อให้แน่ใจว่า พา ธ ไฟล์ทั้งหมดถูกต้อง


13
การทดสอบนั้นไม่จำเป็น ดูโพสต์ของฉัน
Chris Eberle

20
การทดสอบมีความจำเป็นหากคุณต้องการป้องกันไม่ให้ DirectoryNotFoundException
ทิโมธี Strimple

7
ไม่ควรใช้การทดสอบแทนการจัดการสรรพสินค้าใหญ่ แต่ควรนำไปทดสอบด้วย จำนวนสถานการณ์ใด ๆ ที่อาจส่งผลให้การตรวจสอบที่มีอยู่กลับเป็นจริงและลบการโยน
Josh

1
เหตุใดจึงมี@ก่อนหน้าเส้นทางของไฟล์ สำหรับฉันมันทำงานโดยไม่ต้อง
Pascal Ackermann

5
@ ช่วยให้คุณไม่ต้องเพิ่มแบ็กสแลชเป็นสองเท่า
PRMan

105

ใช้System.IO.File.Deleteเช่นนั้น:

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

จากเอกสาร:

หากไฟล์ที่จะลบไม่มีอยู่จะไม่มีข้อยกเว้นเกิดขึ้น


7
สิ่งนั้นจะโยน DirectoryNotFoundException หาก "เส้นทางที่ระบุนั้นไม่ถูกต้อง (ตัวอย่างเช่นจะอยู่ในไดรฟ์ที่ไม่ได้แมป)"
ทิโมธี Strimple

5
ช่างแปลกเหลือเกิน Intellisense An exception is thrown if the specified file does not existกล่าวว่า
fearofawhackplanet

บางทีคุณกำลังใช้. NET Framework รุ่นอื่นอยู่ใช่ไหม
Chris Eberle

1
ฉันใช้. Net4 ดูเหมือนว่า Intellisense ผิดฉันได้ทำการตรวจสอบแล้วและไม่มีข้อยกเว้นเกิดขึ้น
fearofawhackplanet

3
ใช่ฉันพยายามแล้วก็System.IO.File.Delete(@"C:\test.txt");พอแล้ว ขอบคุณ
Berkay Turancı

34

คุณสามารถนำเข้าSystem.IOเนมสเปซได้โดยใช้:

using System.IO;

หาก filepath แสดงพา ธ แบบเต็มไปยังไฟล์คุณสามารถตรวจสอบการมีอยู่ของไฟล์และลบไฟล์ดังต่อไปนี้:

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

2
ทำไมไม่เพียงแค่โทรออกโดยไม่คำนึงถึงและตรวจจับข้อยกเว้นใด ๆ ที่ระบุว่าไฟล์ไม่มีอยู่?
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สำเร็จสิ่งนี้ อีกวิธีหนึ่งก็คือการใช้ประโยชน์PathและDirectoryคลาสยูทิลิตี้ดังนี้

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 และต้องการลบให้แน่ใจว่าคุณปิด FileStream ก่อนที่คุณจะเรียกใช้ File.Delete (พา ธ ) ฉันมีปัญหานี้

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.