1 (изменено: griha09, 2015-07-08 01:39:00)

Тема: VBS: сортировка по длительности видеофайлов

Решил сделать сортировку по длительности видеофайлов. Вот длительность видеофайла я получил


    For Each File in Folder.Files
Set oFileDetailsReader = New cFileDetailsReader
With oFileDetailsReader
    .OpenFile File
        dlit= .GetDetail(27) 
   End With
 Next

Class cFileDetailsReader
    Private oFSO, oShellApp, oFolder3, oFolderItem
    
    Private Sub Class_Initialize()
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oShellApp = CreateObject("Shell.Application")
    End Sub
    
    Sub OpenFile(FilePath)
        With oFSO.GetFile(FilePath)
            Set oFolder3 = oShellApp.NameSpace(.ParentFolder.Path)
            Set oFolderItem = oFolder3.ParseName(.Name)
        End With
    End Sub
    
    Function GetDetail(Index)
        GetDetail = oFolder3.GetDetailsOf(oFolderItem,Index)
    End Function

    Function GetDetailName(Index)
        GetDetailName = oFolder3.GetDetailsOf(0,Index)
    End Function
End Class

а как сравнить с заданной величиной не пойму. Наверно, надо преобразовать полученную длительность в секунды, а потом сравнивать. Но как преобразовать в секунды?

2 (изменено: Flasher, 2015-07-08 04:00:28)

Re: VBS: сортировка по длительности видеофайлов

griha09, мы же это проходили. DateDiff...
Но тут это и не нужно. И имеется в виду сортировка имён или расфасовка самих файлов по папкам-диапазонам длительности?
Если первое, то:

' Показать отсортированный по длительности список видео-файлов в данном каталоге

CD = CreateObject("WScript.Shell").CurrentDirectory
Exts = "*.3gp;*.asf;*.avi;*.mov;*.mp4;*.mpg;*.wmv;*.vob"
Set Folder = CreateObject("Shell.Application").NameSpace(CD)
Title = " Список имён видео-файлов по убыванию длительности"
Set Items  = Folder.Items : Items.Filter 192, Exts
If Items.Count = 0 Then
  MsgBox "Видео-файлы не найдены!", 48, Title
Else
  Set Dict = CreateObject("ADODB.Recordset")
  Dict.Fields.Append "NM", 200, 255
  Dict.Fields.Append "TM", 135, 8 : Dict.Open
  For Each File in Items
    Dict.AddNew : Dur = Folder.GetDetailsOf(File, 27)
    If Not IsEmpty(Dur) Then Dict("NM") = File : Dict("TM") = Dur
  Next : Dict.Sort = "TM DESC"
  MsgBox Replace(Dict.GetString, vbTab, " | "), 64, Title
End If

3 (изменено: wisgest, 2015-07-08 02:57:24)

Re: VBS: сортировка по длительности видеофайлов

1)

griha09 пишет:

а как сравнить с заданной величиной не пойму. Наверно, надо преобразовать полученную длительность в секунды, а потом сравнивать. Но как преобразовать в секунды?

Строки, возвращённыё .GetDetailsOf() можно сравнить преобразовав не в секунды, а в Date с помощью CDate():

MsgBox CDate("01:02:03") > CDate("01:02:04")
MsgBox CDate("01:02:03") > CDate("01:01:04")

4

Re: VBS: сортировка по длительности видеофайлов

Flasher, большое спасибо за ваши советы и скрипты, но для меня ваши скрипты слишком сложные.
Я так и не нашел что значит:

Set Items  = Folder.Items : Items.Filter 192, Exts

или

Dim A(0) : A(0) = 0 : FFolder CD

Для меня сие тайна великая есть.

То что мы проходили в "VBS сложение времени" я честно прошел мимо.

В этой теме меня интересует расфасовка самих файлов по папкам-диапазонам длительности, хотя сортировка имен тоже классно. Вариант wisgest'а

CDate("01:02:03") > CDate("01:02:04")

полностью меня устраивает.
Спасибо!

5 (изменено: Flasher, 2015-07-08 22:28:50)

Re: VBS: сортировка по длительности видеофайлов

griha09
Скрипты мои как раз проще и короче. Никаких классов, приватных процедур, функций и т.д.
Способ сортировки быстрее и легче.
Пройти мимо, значит, не получить правильное решение.
Непосредственно тот скрипт можно было бы там и разобрать.
А что касаемо

Set Items  = Folder.Items
Items.Filter 192, Exts

, то см. сюда.