Cách kiểm tra sự tồn tại của tập tin được nhiều lập trình viên kỳ cựu ưa dùng (2 người xem)

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

nguyendang95

Thành viên thường trực
Tham gia
25/5/22
Bài viết
206
Được thích
179
Thường thì trong VBA có nhiều cách để kiểm tra sự tồn tại của tập tin:
Bằng thư viện COM, ví dụ:
  • FileSystemObject
  • ...
Bằng một số hàm Win32 API. ví dụ:
  • CreateFile
  • FindFirstFile
  • PathFileExists (Shlwapi)
  • ...
Tuy nhiên những cách trên đều đòi hỏi phải mất vài dòng mã để khai báo và hoàn thành công việc trong khi yêu cầu chỉ là biết được tập tin có tồn tại hay không. Trong giới lập trình Windows, người ta đã thống nhất chỉ cần sử dụng duy nhất một hàm GetFileAttributes là đủ để kiểm tra sự tồn tại của tập tin thông qua tìm kiếm thuộc tính (attribute) FILE_ATRRIBUTE_DIRECTORY có trong tập tin hay không.

Mã:
Private Const INVALID_FILE_ATTRIBUTES = -1
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Declare PtrSafe Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesW" (ByVal lpFileName As LongPtr) As Long

Private Function FileExists(ByVal Path As String) As Boolean
    If (Path = vbNullString) Then
        FileExists = False
        Exit Function
    End If
    Dim lngAttr As Long
    lngAttr = GetFileAttributes(StrPtr(Path))
    FileExists = (lngAttr <> INVALID_FILE_ATTRIBUTES And Not (lngAttr = FILE_ATTRIBUTE_DIRECTORY))
End Function

Ví dụ, để kiểm tra xem tập tin với đường dẫn Y:\dstockbot.xlsb có đang tồn tại hay không.

Mã:
Private Sub Test()
    Const strPath As String = "Y:\dstockbot.xlsb"
    Dim strAnswer As String
    strAnswer = IIf(FileExists(strPath), strPath & " exists", strPath & " does not exist")
    Debug.Print strAnswer
End Sub

Tham khảo bài viết của Raymond Chen, một trong những kiến trúc sư đời đầu của hệ điều hành Windows.
Superstition: Why is GetFileAttributes the way old-timers test file existence?
 
Tôi thắc mắc 1 chút là với cách này thì cũng khai báo vài dòng rồi phải chép thêm 1 cái hàm FileExists nữa mới dùng được. Vậy chẳng phải dài dòng hơn sao?
 
Upvote 0
Tôi thắc mắc 1 chút là với cách này thì cũng khai báo vài dòng rồi phải chép thêm 1 cái hàm FileExists nữa mới dùng được. Vậy chẳng phải dài dòng hơn sao?
Cái đáng giá ở đây là chỉ cần gọi một hàm GetFileAttributes duy nhất là xác định được tập tin có tồn tại hay không, còn việc bạn viết code dài hay ngắn để hỗ trợ triển khai logic sử dụng hàm đó thì là do bạn mà.
 
Upvote 0
có nhiều hàm kiểm tra file tốt tuy nhiên thử duyệt 2000 vòng lặp kiểm tra file và đo thời gian xem hàm nào nhanh nhất thì dùng hàm đó
 
Upvote 0
Cái đáng giá ở đây là chỉ cần gọi một hàm GetFileAttributes duy nhất là xác định được tập tin có tồn tại hay không, còn việc bạn viết code dài hay ngắn để hỗ trợ triển khai logic sử dụng hàm đó thì là do bạn mà.
Vậy chỉ cần khai báo 1 dòng cho hàm rồi dùng. Nếu kết quả trả về là 32 thì tập tin tồn tại, còn khác đi là không tồn tại?
 
Upvote 0
Vậy chỉ cần khai báo 1 dòng cho hàm rồi dùng. Nếu kết quả trả về là 32 thì tập tin tồn tại, còn khác đi là không tồn tại?
Điều kiện xác định một tập tin có tồn tại hay không là ở đây:
FileExists = (lngAttr <> INVALID_FILE_ATTRIBUTES And Not (lngAttr = FILE_ATTRIBUTE_DIRECTORY))
Tập tin không tồn tại khi:
  • Giá trị thuộc tính trả về là INVALID_FILE_ATTRIBUTES, tức là hiện không có tập tin nào.
  • Hoặc không có thuộc tính FILE_ATTRIBUTE_DIRECTORY (chỉ ra đây là thư mục chứ không phải là tập tin).
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom