Xác định file hay folder hay không gì cả?

bvtvba

Thành viên tích cực
Ở topic này, có một điều tuyệt vời đã được giải quyết, đó là người dùng có thể chọn file hay link folder.
Đây là câu chuyện đã từng làm đau đầu nhiều người code VBA.
Bài toán đặt ra là, khi người dùng kéo folder hay file, thì trên ô textbox hiển thị đường link của file hay folder đó.
Như vậy người code cần kiểm tra input, là đường link nhập vào có đúng hay không.
Tức là kiểm tra được file hay folder có tồn tại hay không trước khi thực thi đoạn code xử lý chính.

Em có xây dựng đoạn code dưới đây:
Mã:
Sub test()
    Dim lk As String
    lk = "D:\CODE\0412"
    Debug.Print KtraFileFolder(lk) 'Gia tri ky vong 2
    lk = "D:\CODE\0412\DL.xlsb"
    Debug.Print KtraFileFolder(lk) 'Gia tri ky vong 1
    lk = "D:\THVBA"
    Debug.Print KtraFileFolder(lk) 'Gia tri ky vong 0
End Sub
'0: Khong biet
'1: File
'2: Folder
Function KtraFileFolder(ByVal lk As String) As Byte
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FolderExists(lk) Then
        KtraFileFolder = 2
    ElseIf fso.FileExists(lk) Then
        KtraFileFolder = 1
    Else
        KtraFileFolder = 0
    End If
End Function
Mọi người cho thêm ý kiến để chúng ta thảo luận cho rôm rả nhé.
 

PTHhn

Thành viên
Nếu link nhập đúng, theo cách làm của bvtvba thì có thể xác định được đó là File hay Folder.
Nếu nhập sai thì chỉ biết là không tồn tại, nhưng lại không chỉ ra được đó là File không tồn tại hay Folder không tồn tại.
Ý của tôi là, bằng cách nào đó phán đoán được ý đồ người dùng nhập folder hay file nhưng họ đã nhập sai.
 

tuhocvba

Administrator
Thành viên BQT
Khó đấy. Vì link folder thực ra cũng rất dễ giống link file.
Chẳng hạn ta có link folder như sau:
D:\CODE\0412\DL.xlsb
Trong đó DL.xlsb là tên folder.

Để đoán được người dùng muốn nhập link file hay link folder, ta phải có một định nghĩa ép buộc người dùng.
Nếu họ nhập link folder thì trên textbox phải hiển thị là:
D:\CODE\0412\DL.xlsb\
Như vậy thì chúng ta sẽ kiểm tra lk có kết thúc bằng \ hay không. Nếu có thì đó là folder. Nếu không có thì đó là file.
Tiếp theo nếu không tồn tại thì ra kết luận là file không tồn tại hoặc folder không tồn tại, chứ không nói chung chung là "không tồn tại" nữa.

Vậy đoạn code DragDrop, ngay khi người dùng kéo thả vào textbox phải biết họ đang kéo thả file hay folder. Tạm thời tôi chưa tìm hiểu, ai rành thì bổ sung vào topic này nhé.

Tôi đi theo hướng 2. Ngay khi kéo thả thì lk luôn tồn tại. Bởi vì hành vi kéo thả đó là thực tế đã diễn ra. Quay lại #1 nếu file lk tồn tại thì link lk đó là file, giữ nguyên. Nếu folder lk tồn tại thì thêm lk = lk &"\" điền vào textbox, vậy là ta sẽ có định dạng mong muốn: D:\CODE\0412\DL.xlsb\ . Lúc này bài toán được giải quyết. (chú ý ngay khi diễn ra động tác kéo thả xảy ra thì không bao giờ xảy ra trường hợp lk không tồn tại, nếu lk là rỗng thì nó thuộc về cảnh báo khác-người dùng chưa nhập input).
 

NhanSu

Thành Viên Nổi Bật

Khi drop một item vào textbox thì ta biết được đó là file hay folder nhưng không có gì đảm bảo là người dùng không sửa đoạn text đó. Vì vậy ta chỉ nên kiểm tra sau khi người dùng đã bấm ok để đóng form.
 

PTHhn

Thành viên
Cảm ơn bạn tuhocvba, lời giải của bạn rất hay. Tôi định phản biện là:
Trong thư mục :
D:\CODE\0412\
Nếu tồn tại cả file DL.xlsb và folder name là DL.xlsb thì sao. Nhưng tôi đã thử, nếu trong đó có file tên như trên thì không thể tạo được folder có tên như vậy nữa, chỉ có thể tạo ra folder có tên khác đi, chẳng hạn DL2.xlsb
Như vậy lời giải của bạn là chính xác.
Còn hướng giải khác như vấn đề anh nêu dưới đây thì tôi cũng không biết.
Vậy đoạn code DragDrop, ngay khi người dùng kéo thả vào textbox phải biết họ đang kéo thả file hay folder. Tạm thời tôi chưa tìm hiểu, ai rành thì bổ sung vào topic này nhé.
 

NhanSu

Thành Viên Nổi Bật

@tuhocvba mình cũng kiểm tra như bài 1 thôi. Filesy stem object dùng được cả với đường dẫn bằng tiếng Việt có dấu.
@PTHhn bạn thử test xem khi textbox.enabled=false xem có drop được không. Mình không có máy ở đây để thử.
 

PTHhn

Thành viên
NhanSu nói:
Khi drop một item vào textbox thì ta biết được đó là file hay folder
Mình cũng muốn xin đoạn code phán đoán file hay folder khi kéo thả. Bạn cho mình với.
Về ô textbox, :
Bạn tìm code sau:
Mã:
This.ctl.Text = buf
Sửa thành:
Mã:
This.ctl.Text = buf
     UserForm1.TextBox1.Locked = True
Bạn vẫn có thể kéo thả và khóa luôn ô textbox.
 

bvtvba

Thành viên tích cực
bạn thử test xem khi textbox.enabled=false xem có drop được không. Mình không có máy ở đây để thử.
Mình cũng muốn xin đoạn code phán đoán file hay folder khi kéo thả. Bạn cho mình với.
Về ô textbox, :
Bạn tìm code sau:
Mã:
This.ctl.Text = buf
Sửa thành:
Mã:
This.ctl.Text = buf
     UserForm1.TextBox1.Locked = True
Bạn vẫn có thể kéo thả và khóa luôn ô textbox.
Mình thử rồi, lock textbox ngay từ đầu, không cần sửa code, vẫn nhận link bình thường.
 

NhanSu

Thành Viên Nổi Bật

Thì code bài 1 đã ghi rõ rồi mà bạn. Mình cũng làm vậy thôi không ngắn gọn hơn được. Ngoài ra làm việc với file và folder nên có bẫy lỗi, ví dụ ta cần mở file thì có thể dùng (mặc dù file thực tế tồn tại nhưng không mở được do đã mở sẵn rồi chẳng hạn).
Mã:
On error resume next
Set wb=Workbooks.open(s)
On error goto 0
If wb is nothing then 'cannot open workbook
 

tuhocvba

Administrator
Thành viên BQT
Mọi người nói chuyện hiểu sai câu chuyện hết rồi. Thôi vấn đề ra thông baó file không tồn tại hay folder không tồn tại giải quyết xong rồi nhé.
Bạn cần đăng nhập để thấy đính kèm
 
Top