Sub GetVideoLength()
Const typeVideo = "MP4,WMV,..."
Const MainFolderName = "C:\Users\Administrator\Desktop" '<------ duong dan Folder chua cac video
Dim objShell As Object, objFolder As Object, objFolderItem As Object
Dim FSo As Object, oFolder As Object, oFile As Object, extFile As String
Dim res As Variant, i As Long
Set objShell = CreateObject("Shell.Application")
Set FSo = CreateObject("scripting.FileSystemObject")
Set oFolder = FSo.GetFolder(MainFolderName)
Set objFolder = objShell.Namespace(oFolder.path)
ReDim res(1 To oFolder.Files.Count, 1 To 2)
For Each oFile In oFolder.Files
extFile = FSo.GetExtensionName(oFile)
If InStr(1, typeVideo, extFile, vbTextCompare) > 0 Then
i = i + 1
Set objFolderItem = objFolder.ParseName(oFile.Name)
res(i, 1) = oFile.Name
res(i, 2) = objFolder.GetDetailsOf(objFolderItem, 27)
End If
Next oFile
Sheet1.Range("A2").Resize(100000, 2).ClearContents
If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
Sub GetVideoLength_2()
Const typeVideo = "Video"
Const pathFolder = "C:\Users\Administrator\Desktop"
Dim oShell As Object, objFolder As Object, oFile As Object
Dim res As Variant, i As Long
Set oShell = CreateObject("Shell.Application")
Set objFolder = oShell.Namespace(pathFolder)
ReDim res(1 To objFolder.Items.Count, 1 To 2)
For Each oFile In objFolder.Items
If objFolder.GetDetailsOf(oFile, 9) = typeVideo Then
i = i + 1
res(i, 1) = oFile.Name
res(i, 2) = objFolder.GetDetailsOf(oFile, 27)
End If
Next
Sheet1.Range("A2").Resize(100000, 2).ClearContents
If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
Cũng không hẳn như thế đâu. Trong thư mục của tôi chỉ có 1 video WMV. Trong thư mục thì cột Typ trả về "Windows Media Video File". Chạy code của bạn thì không có kết quả.Em tìm mãi mới thấy cái File Type.
PHP:Sub GetVideoLength_2() Const typeVideo = "Video" Const pathFolder = "C:\Users\Administrator\Desktop" Dim oShell As Object, objFolder As Object, oFile As Object Dim res As Variant, i As Long Set oShell = CreateObject("Shell.Application") Set objFolder = oShell.Namespace(pathFolder) ReDim res(1 To objFolder.Items.Count, 1 To 2) For Each oFile In objFolder.Items If objFolder.GetDetailsOf(oFile, 9) = typeVideo Then i = i + 1 res(i, 1) = oFile.Name res(i, 2) = objFolder.GetDetailsOf(oFile, 27) End If Next Sheet1.Range("A2").Resize(100000, 2).ClearContents If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res End Sub
Const typeVideo = "Windows Media Video File"
...
If objFolder.GetDetailsOf(oFile, 2) = typeVideo Then
Chắc do máy tính của anh, hoặc lý do gì đó em chịu.Cũng không hẳn như thế đâu. Trong thư mục của tôi chỉ có 1 video WMV. Trong thư mục thì cột Typ trả về "Windows Media Video File". Chạy code của bạn thì không có kết quả.
Nếu sửa thành
Thì có kết quả.Mã:Const typeVideo = "Windows Media Video File" ... If objFolder.GetDetailsOf(oFile, 2) = typeVideo Then
Tất nhiên không thể cứng nhắc Const typeVideo = "Windows Media Video File" vì video có thể có nhiều typ.
Ngoài ra objFolder.GetDetailsOf(oFile, 27) trả về trên máy tôi kết quả "640 pikseli". Không quan trọng chuyện "pikseli" vì đó là tiếng Ba Lan. Nhưng rõ ràng 640 không là thời gian phim dài bao nhiêu. Mà chủ thớt hỏi về thời gian.
Tôi không nói sai hay đúng. Tôi nói làChắc do máy tính của anh, hoặc lý do gì đó em chịu.
Trước khi gửi đáp án em đã chạy thử với *.mp4, *.wmv và cho kết quả đúng.
Tức tùy theo system mà có thể khác nhau. Tôi dùng XP Home. Ý là nếu viết code mà muốn kết quả không phụ thuộc vào system thì không thể mặc định được là "Video".Cũng không hẳn như thế đâu
Bạn giúp Giúp cho Chót:PHP:Sub GetVideoLength() Const typeVideo = "MP4,WMV,..." Const MainFolderName = "C:\Users\Administrator\Desktop" '<------ duong dan Folder chua cac video Dim objShell As Object, objFolder As Object, objFolderItem As Object Dim FSo As Object, oFolder As Object, oFile As Object, extFile As String Dim res As Variant, i As Long Set objShell = CreateObject("Shell.Application") Set FSo = CreateObject("scripting.FileSystemObject") Set oFolder = FSo.GetFolder(MainFolderName) Set objFolder = objShell.Namespace(oFolder.path) ReDim res(1 To oFolder.Files.Count, 1 To 2) For Each oFile In oFolder.Files extFile = FSo.GetExtensionName(oFile) If InStr(1, typeVideo, extFile, vbTextCompare) > 0 Then i = i + 1 Set objFolderItem = objFolder.ParseName(oFile.Name) res(i, 1) = oFile.Name res(i, 2) = objFolder.GetDetailsOf(objFolderItem, 27) End If Next oFile Sheet1.Range("A2").Resize(100000, 2).ClearContents If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res End Sub
Tôi đã kiểm tra trên 2 máy của tôi:Chắc do máy tính của anh, hoặc lý do gì đó em chịu.
Trước khi gửi đáp án em đã chạy thử với *.mp4, *.wmv và cho kết quả đúng.
Chả cần bác nói thì tôi cũng đã thử rồi. Chỉ số tính từ 0, và tôi thử từ 0 đến 60 cơ. Nhưng từ 29 trở đi tôi thấy hoặc rỗng hoặc chả có gì "quan trọng".Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
Rất tiếc, các cột của Explorer không hoàn toàn giống nhau cho các phiên bản khác nhau của Windows.
Và điều đáng tiếc thứ hai là MS không có tài liệu giải thích rõ chuyện này.
Tôi nghĩ WinXP thì bác phải thử luôn từ 0 đến 50+. Và có lẽ phải thử nhiều loại files để đúc kết ra kết quả.
(tôi nhớ mang máng hình như Win2000 chỉ có tới 30+ columns)
Nó là cách đối tượng Folder dùng để tạo chỉ số cho các cột của nó. Các cột là một collection, và có một con toán enumerate để đặt chỉ số cho từng cột.... Như thế thì thứ tự cột trong Explorer không phải là các chỉ số.
Thì ý tôi cũng chỉ là: ta cứ biết đấy là các chỉ số có định nghĩa. Thế thôi. Nhắc tới Explorer thì có thể lại gây hiểu lầm không đáng có.Nó là cách đối tượng Folder dùng để tạo chỉ số cho các cột của nó. Các cột là một collection, và có một con toán enumerate để đặt chỉ số cho từng cột.
Cái thứ tự ta nhìn thấy trên Explorer là chỉ số ảo. Cái thứ tự ta nhìn thấy theo bảng chọn lựa properties của folder gần với số này hơn.
Cái phiên bản COM (nằm trong Shell32.dll) dùng cho Win2000 khác với Win7. Và cách enum của chúng hơi khác nhau.
Cái COM ấy nó cũng được Explorer sử dụng để lập các cột. Lúc ấy Windows cũng đang phát triển Visual Studio cho nên cái tên "columns" có thể lấy theo đối tượng GridView, chúng dùng chỉ số (enum theo C++) để xác định danh phận trong collection.Thì ý tôi cũng chỉ là: ta cứ biết đấy là các chỉ số có định nghĩa. Thế thôi. Nhắc tới Explorer thì có thể lại gây hiểu lầm không đáng có.
Windows nó không cho cái dãy enum kia thì mình bắt buộc phải tự tạo lấy....
- Windows phiên bản tiếng Anh: Image (vd. PNG), Text (vd. TXT), Document (vd. DOC), Audio (vd. WMA), Video (vd. MP4, WMV, WEBM)
- Windows phiên bản tiếng Ba Lan: Obraz, Tekst, Dokument, Audio, Wideo
Không phải trên Windows Explorer đâu anh. Trên Windows Explorer thay đổi vị trí các cột đó thoải mái mà không ảnh hưởng tới iColumn.Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
.Không phải trên Windows Explorer đâu anh. Trên Windows Explorer thay đổi vị trí các cột đó thoải mái mà không ảnh hưởng tới iColumn.
...