Обновлен эквивалентный код для использования Shell в VB. NET с FolderItem.GetDetailsOf - PullRequest
0 голосов
/ 27 мая 2020

Я надеюсь, что кто-то сможет указать мне в этом правильном направлении. Я потратил часы, пытаясь заставить мой код работать безуспешно.

Я написал программу в Visual Studio, используя VB. NET, которая открывала бы каталог, перебирала все файлы и переименовывала каждый / скопируйте их в новую папку. Теперь я пытаюсь заставить программу читать определенный атрибут каждого файла и включать его в имя файла. Это будет атрибут Media Created или Date Created. Похоже, я могу сделать это с помощью метода Folder.GetDetailsOf .

Пример кода, предоставленный Microsoft для VB, выглядит следующим образом:

Private Sub btnGetDetailsOf_Click()
    Dim objShell  As Shell
    Dim objFolder As Folder

    Set objShell = New Shell
    Set objFolder = objShell.NameSpace("C:\WINDOWS")

    If (Not objFolder Is Nothing) Then
        Dim objFolderItem As FolderItem
        Set objFolderItem = objFolder.ParseName("clock.avi")

        If (Not objFolderItem Is Nothing) Then
            Dim szItem As String
            szItem = objFolder.GetDetailsOf(objFolderItem, 2)
        End If

        Set objFolderItem = Nothing
    End If

    Set objFolder = Nothing
    Set objShell = Nothing
End Sub

Однако, когда пытаясь скомпилировать, я получаю много ошибок, в том числе не определены Shell, Folder и FolderItem.

После большого количества поисков и чтений статей я дошел до этого момента с моим кодом, но он выдает ошибку, когда пытаюсь установить objFolderItem.

Dim di As New DirectoryInfo(c:\folder)
Dim fileArray As FileInfo() = di.GetFiles()
Dim file As FileInfo

Dim objShell As Object
Dim objFolder As Object
Dim objFolderItem As Object

objShell = CreateObject("Shell.Application")
objFolder = objShell.NameSpace(c:\folder) 'create folder object

For Each file In fileArray
    objFolderItem = objFolder.ParseName(file.Name) 'create file object
    MsgBox(objFolder.getdetailsof(objFolderItem, 201))
Next file

Когда я проверяю работающий код, кажется, что objShell.NameSpace ничего не возвращает.

Может кто-нибудь посоветовать, как я могу создать исправление objShell в VB. NET или предоставить обновленную версию примера кода Microsoft, чтобы я мог использовать это в качестве основы?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 июня 2020

Спасибо за вашу помощь. Мне удалось заставить это работать, импортировав Microsoft Shell Controls And Automation и используя приведенный ниже код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim objShell As Object
        Dim objFolder As Object

        objShell = New Shell32.Shell
        objFolder = objShell.NameSpace("D:\FOLDERNAME")

        If (Not objFolder Is Nothing) Then
            Dim objFolderItem As Object

            objFolderItem = objFolder.ParseName("FILENAME")

            MsgBox(objFolderItem.name & " " & objFolder.getdetailsof(objFolderItem, 208))

            objFolderItem = Nothing
        End If

        objFolder = Nothing
        objShell = Nothing
    End Sub

Еще раз большое спасибо за вашу помощь

0 голосов
/ 27 мая 2020

Это очень много кода для простой задачи. Вам не нужно использовать оболочку. Для копирования / перемещения:

My.Computer.FileSystem.CopyDirectory(<SourceDir>, <DestinationDir>)

Для переименования файла:

My.Computer.FileSystem.RenameFile("CurrentName", "DesiredName")

Для получения атрибутов файла:

attributes = File.GetAttributes(path)
...