Xóa tệp trong VBA


Câu trả lời:


168

1.) Kiểm tra tại đây . Về cơ bản làm điều này:

Function FileExists(ByVal FileToTest As String) As Boolean
   FileExists = (Dir(FileToTest) <> "")
End Function

Tôi sẽ giao nó cho bạn để tìm ra các xử lý lỗi khác nhau cần thiết nhưng đây là một trong những cách xử lý lỗi mà tôi sẽ xem xét:

  • Kiểm tra một chuỗi trống đang được chuyển.
  • Kiểm tra một chuỗi chứa các ký tự không hợp lệ trong tên / đường dẫn tệp

2.) Cách xóa tệp. Nhìn này. Về cơ bản sử dụng lệnh Kill nhưng bạn cần cho phép khả năng tệp ở chế độ chỉ đọc. Đây là một chức năng dành cho bạn:

Sub DeleteFile(ByVal FileToDelete As String)
   If FileExists(FileToDelete) Then 'See above          
      ' First remove readonly attribute, if set
      SetAttr FileToDelete, vbNormal          
      ' Then delete the file
      Kill FileToDelete
   End If
End Sub

Một lần nữa, tôi sẽ giao việc xử lý lỗi cho bạn và một lần nữa đây là những điều tôi sẽ xem xét:

  • Điều này có nên hoạt động khác nhau cho một thư mục so với một tệp không? Người dùng có nên phải cho biết rõ ràng họ muốn xóa một thư mục không?

  • Bạn có muốn mã tự động đặt lại thuộc tính chỉ đọc hay người dùng phải được cung cấp một số loại dấu hiệu cho thấy thuộc tính chỉ đọc đã được đặt?


CHỈNH SỬA: Đánh dấu câu trả lời này là wiki cộng đồng để bất kỳ ai cũng có thể sửa đổi nếu cần.


cảm ơn bạn - điều gì sẽ xảy ra nếu có hai tệp cùng tên tồn tại, tệp con DeleteFile sẽ giết cả hai tệp đó hay chỉ một tệp? bất kỳ lời khuyên nào được đánh giá cao.
BKSpurgeon

6
Bạn không thể có hai tệp có cùng tên trong một thư mục.
Onorio Catenacci

52

Một cách khác để mã hóa câu trả lời của Brettski, mà tôi hoàn toàn đồng ý, có thể là

With New FileSystemObject
    If .FileExists(yourFilePath) Then
        .DeleteFile yourFilepath
    End If
End With

Tác dụng tương tự nhưng ít khai báo biến hơn (tốt, không có).

FileSystemObject là một công cụ thực sự hữu ích và rất đáng để làm quen với. Ngoài bất cứ điều gì khác, đối với việc ghi tệp văn bản, nó thực sự đôi khi có thể nhanh hơn so với giải pháp thay thế cũ, điều này có thể khiến một số người ngạc nhiên. (Theo kinh nghiệm của tôi ít nhất là YMMV).


7
Sử dụng cú pháp này mà không cần khai báo một đối tượng tập tin kịch bản, phải thêm tài liệu tham khảo cho Microsoft Scripting Runtime, khác: Dim fs As New Scripting.FileSystemObject
pghcpa

5
bạn cũng cần tham khảo thư viện script. xem tại đây: stackoverflow.com/questions/3233203/…
ekkis

Vì không có biến nào để đặt thành Không có gì, nên có nguy cơ FileSystemObject sẽ vẫn còn trong bộ nhớ, gây ra rò rỉ hoặc sự cố khác không?
johny tại sao

Không, nó sẽ bị hủy sau "End With". Vì nó không được gán cho một biến nên hiệu ứng tương tự như đối tượng đã được gán cho một biến đã được đặt thành "Không có gì".
jony

15

Tôi có thể sẽ bị kích thích vì điều này, nhưng kiểm tra sự tồn tại có ích gì nếu bạn chỉ định xóa nó? Một trong những kẻ trộm thú cưng chính của tôi là một ứng dụng đưa ra hộp thoại lỗi với nội dung như "Không thể xóa tệp, tệp không tồn tại!"

On Error Resume Next
aFile = "c:\file_to_delete.txt"
Kill aFile
On Error Goto 0
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted.

Nếu tệp không tồn tại ngay từ đầu, nhiệm vụ đã hoàn thành!


4
Bạn nêu ra một điểm tốt nhưng, giống như hầu hết mọi thứ, tôi nghĩ rằng nó sẽ phụ thuộc vào ngữ cảnh và đôi khi chỉ cần có chức năng "Tệp Tồn tại" là tiện dụng ngoài việc xóa.
Onorio Catenacci

3
+1: có thể người dùng ứng dụng muốn được hỏi trước khi xóa tệp: ví dụ: sử dụng ActiveWorkbook.SaveCopyAskhông thể ghi đè, vì vậy trước tiên bạn phải xóa tệp hiện có có cùng tên tệp.
Joël

nhưng bạn không bao giờ nên sử dụng On Error Resume Next, hoặc như vậy tôi đã được nói: D Tất nhiên, đó là lời khuyên vô lý, và câu trả lời của bạn là đúng.
johny tại sao

Phần Len(dir(...))không thể kiểm tra sự tồn tại của nó. Nó cũng được kiểm tra nếu các tập tin bị ẩn vì một tập tin ẩn sẽ trả về một chuỗi rỗng thậm chí nếu nó tồn tại (và bạn sẽ không thể xóa nó): Dir(hiddenFile) = "". Do đó, phần SetAttr FileToDelete, vbNormalhùng hồn sẽ giải quyết vấn đề này cho bạn.
elektrykalAJ

11

Phần sau có thể được sử dụng để kiểm tra sự tồn tại của tệp và sau đó để xóa tệp đó.

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 

3
Tôi biết câu hỏi và câu trả lời này đã cũ, chỉ nghĩ rằng tôi muốn nói thêm rằng việc sử dụng Len () để kiểm tra chuỗi (và các hàm trả về chuỗi) dường như nhanh hơn so với so sánh chuỗi theo nghĩa đen trong VBA.
JimmyPena

7
Lý do mà Len()(và LenB()thậm chí còn nhanh hơn) nhanh hơn so với so sánh chuỗi là trong bộ nhớ, chuỗi VB được đặt trước độ dài của chúng. Len / LenB chỉ cần kéo độ dài từ vị trí bộ nhớ đó, họ không cần phải lặp qua chuỗi để biết độ dài của nó. Mặt khác, sử dụng so sánh chuỗi có nhiều việc phải làm hơn. Ngoài ra, tránh sử dụng ""trong VB vì nó luôn cấp phát một chuỗi mới. Sử dụng vbNullStringthay thế vì nó là một hằng số và không sử dụng thêm bộ nhớ.
Renaud Bompuis

7

Trong VB bình thường của nó Dirđể tìm thư mục của tệp. Nếu nó không trống thì nó tồn tại và sau đó sử dụng Killđể loại bỏ tệp.

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If

6

đặt một tham chiếu đến thư viện Scripting.Runtime và sau đó sử dụng FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if

Tôi sử dụng phương pháp FileSystemObject quá, như Kill là không thể xóa các file / thư mục với diacritis
mauek unak

Đây là phương pháp tôi sử dụng .. Ai đó thực hiện điều này muốn sử dụng kiểm tra lỗi và DisplayAlerts = false. (Các tập tin sẽ không xóa nếu nó đang được sử dụng, vì vậy phải có bẫy lỗi)
Gregg Burns

3

Đây là mẹo: bạn đang sử dụng lại tên tệp hay định làm điều gì đó yêu cầu xóa ngay lập tức?

Không?

Bạn có thể nhận VBA để kích hoạt lệnh DEL "C: \ TEMP \ xướcpad.txt" / F từ dấu nhắc lệnh một cách không đồng bộ bằng VBA.

Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide

Lưu ý dấu ngoặc kép (ký tự ASCII 34) xung quanh tên tệp: Tôi giả sử rằng bạn có một đường dẫn mạng hoặc một tên tệp dài có chứa khoảng trắng.

Nếu đó là một tệp lớn hoặc nó có kết nối mạng chậm, cứu hỏa và quên là cách để thực hiện. Tất nhiên, bạn sẽ không bao giờ biết được điều này có hiệu quả hay không; nhưng bạn tiếp tục VBA của mình ngay lập tức và đôi khi điều này tốt hơn là chờ mạng.


Đây là một sự thay thế tuyệt vời, nếu asynch là những gì bạn muốn.
johny tại sao

2

Bạn có thể đặt một tham chiếu đến thư viện Scripting.Runtime và sau đó sử dụng FileSystemObject. Nó có một phương thức DeleteFile và một phương thức FileExists.

Xem bài viết MSDN tại đây .

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.