Làm thế nào để xóa một tập tin sau khi kiểm tra xem nó tồn tại


220

Làm cách nào tôi có thể xóa một tệp trong C # C:\test.txt, ví dụ: mặc dù áp dụng cùng loại phương thức như trong các tệp bó

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Câu trả lời:


388

Điều này khá đơn giản khi sử dụng lớp File .

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


Như Chris đã chỉ ra trong các nhận xét, bạn thực sự không cần thực hiện File.Existskiểm tra vì File.Deletekhông ném ngoại lệ nếu tệp không tồn tại, mặc dù nếu bạn đang sử dụng đường dẫn tuyệt đối, bạn sẽ cần kiểm tra để đảm bảo toàn bộ đường dẫn tập tin là hợp lệ.


13
Thử nghiệm đó không thực sự cần thiết. Xem bài viết của tôi.
Chris Eberle

20
Kiểm tra là cần thiết nếu bạn muốn ngăn chặn DirectoryNotFoundException có thể.
Timothy Strimple

7
Thử nghiệm không nên được sử dụng thay cho xử lý ngoại lệ tho, mà là để dẫn truyền với nó. Bất kỳ số lượng kịch bản có thể dẫn đến kiểm tra tồn tại trả về đúng và xóa ném.
Josh

1
Tại sao có một @đường dẫn trước tập tin? Đối với tôi nó hoạt động mà không có.
Pascal Ackermann

5
@ giữ cho bạn khỏi phải tăng gấp đôi dấu gạch chéo ngược.
PRMan

105

Sử dụng System.IO.File.Delete như vậy:

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

Từ tài liệu:

Nếu tập tin bị xóa không tồn tại, không có ngoại lệ được ném.


7
Điều đó sẽ ném ra DirectoryNotFoundException nếu "Đường dẫn được chỉ định không hợp lệ (ví dụ: đường dẫn này không có ổ đĩa)."
Timothy Strimple

5
Thật kỳ quặc làm sao. Intellisense nói An exception is thrown if the specified file does not exist.
sợofawhackplanet

Có lẽ bạn đang sử dụng một phiên bản khác của .NET framework?
Chris Eberle

1
Tôi đang sử dụng .Net4, có vẻ như intellisense bị sai Tôi đã chạy một kiểm tra và không có ngoại lệ nào bị ném
sợofawhackplanet

3
Vâng tôi đã cố gắng và chỉ System.IO.File.Delete(@"C:\test.txt");là đủ. Cảm ơn
Berkay Turancı

33

Bạn có thể nhập System.IOkhông gian tên bằng cách sử dụng:

using System.IO;

Nếu filepath thể hiện đường dẫn đầy đủ đến tệp, bạn có thể kiểm tra sự tồn tại của nó và xóa nó như sau:

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

2
Tại sao không phát hành cuộc gọi Xóa bất kể và bắt bất kỳ ngoại lệ nào cho biết rằng tệp không tồn tại?
antred

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

nhưng

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

sẽ làm tương tự như khi thư mục tồn tại.


23

Nếu bạn muốn tránh, DirectoryNotFoundExceptionbạn sẽ cần đảm bảo rằng thư mục của tập tin thực sự tồn tại. File.Existshoàn thành việc này Một cách khác là sử dụng các lớp tiện ích PathDirectorynhư vậy:

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

Nếu bạn đang đọc từ tệp đó bằng FileStream và sau đó muốn xóa nó, hãy đảm bảo bạn đóng FileStream trước khi bạn gọi File.Delete (đường dẫn). Tôi đã có vấn đề này.

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

Hoặc sử dụng một usingtuyên bố, nơi File.Delete()sẽ đi ra ngoài dấu ngoặc. Trong ví dụ bạn có, bạn cũng nên làm a filestream.Dispose();.
vapcguy

1

Đôi khi bạn muốn xóa một tập tin bất kể trường hợp nào (bất kỳ trường hợp ngoại lệ nào xảy ra, vui lòng xóa tập tin). Đối với những tình huống như vậy.

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

Lưu ý: Một ngoại lệ không được ném nếu tệp được chỉ định không tồn tại.


10
Vì vậy, bạn đang cố gắng xóa tệp 20 lần mỗi giây cho đến khi nó bị xóa. Điều gì xảy ra nếu, vì một số lý do, tập tin không thể bị xóa và chương trình sẽ cố gắng xóa nó mãi mãi? Tôi không nghĩ rằng đây là giải pháp tốt.
kv1dr

2
Ít nhất, bạn nên cung cấp một tham số thời gian chờ.
antred

@ kv1dr đúng. Tôi nghĩ bạn nên thử trong một thời gian giới hạn và trả lại thông báo lỗi nếu tệp không bị xóa.
QMaster

0

Đây sẽ là cách đơn giản nhất,

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

Thread.sleep sẽ giúp làm việc hoàn hảo, nếu không, nó sẽ ảnh hưởng đến bước tiếp theo nếu chúng ta sao chép hoặc ghi tệp.

Một cách khác tôi đã làm là,

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.