-->

What options are available for Shell32.Folder.GetD

2019-01-26 18:05发布

问题:

I've seen answers using GetDetailsOf() to get details about shell items, but the numbers are always magic numbers.

I've looked at the docs for both FolderItem and GetDetailsOf but found nothing. (The list in the latter is not for everything. They don't cover "Description", "Authors", nor the recycle bin delete date...)

Is there some method that will return the possible options for an item? Is it listed somewhere?

回答1:

I figured this out by accident. If you pass null into GetDetailsOf then it responds with the column names. For example, execute the following JScript with cscript:

var shellapp = WScript.CreateObject("Shell.Application");
var folder = shellapp.NameSpace("D:\\");
for (var j = 0; j < 0xFFFF; j++) {
    detail = folder.GetDetailsOf(null, j);
    if (!detail) {
        break;
    }
    WScript.Echo("[" + j + "] = " + detail);
}

On my Windows 10 system this outputs:

[0] = Name
[1] = Size
[2] = Item type
[3] = Date modified
[4] = Date created
[5] = Date accessed
[6] = Attributes
[7] = Offline status
[8] = Availability
[9] = Perceived type
[10] = Owner
[11] = Kind
[12] = Date taken
[13] = Contributing artists
[14] = Album
[15] = Year
[16] = Genre
[17] = Conductors
[18] = Tags
[19] = Rating
[20] = Authors
[21] = Title
[22] = Subject
[23] = Categories
[24] = Comments
[25] = Copyright
[26] = #
[27] = Length
[28] = Bit rate
[29] = Protected
[30] = Camera model
[31] = Dimensions
[32] = Camera maker
[33] = Company
[34] = File description
[35] = Program name
[36] = Duration
[37] = Is online
[38] = Is recurring
[39] = Location
[40] = Optional attendee addresses
[41] = Optional attendees
[42] = Organizer address
[43] = Organizer name
[44] = Reminder time
[45] = Required attendee addresses
[46] = Required attendees
[47] = Resources
[48] = Meeting status
[49] = Free/busy status
[50] = Total size
[51] = Account name

And this is quite different from Windows 2000 as detailed from Retrieving Extended File Properties. Incidentally if you pass in a different NameSpace then you're going to get different attributes. In my example, I'm asking what attributes are available for files on drive D: which could be different depending on its format.



回答2:

A VBA function do the job. Microsoft Scripting Runtime and Microsoft Shell Controls And Automation needed

Function Propriétés(Chemin As String, Fichier As String)
    'Chemin représente le chemin du dossier où se trouve le fichier MP3
    'Fichier représente le nom du fichier mp3 avec l'extension
    Dim Shl As New Shell32.Shell
    Dim Rep As Shell32.Folder
    Dim fich As Shell32.FolderItem

    Dim aPropName() As String, i As Integer
    Set Shl = CreateObject("Shell.Application")
    Set Rep = Shl.Namespace(Chemin)
    Set fich = Rep.Items.Item(Fichier)
    For i = 0 To 1000
        ReDim Preserve aPropName(i)
        aPropName(i) = Format(i, "000 : ") & Rep.GetDetailsOf(Null, i)
        If Len(Rep.GetDetailsOf(Null, i)) = 0 Then
            ReDim Preserve aPropName(i - 1)
            Exit For
        End If
    Next
    ' Create ouput file
    Dim Fso, MyFile
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = Fso.CreateTextFile(Chemin & "\Prop Liste - " & Fichier & ".txt", True)
    MyFile.Write Join(aPropName, Chr(13))
    MyFile.Close
    Set Fso = Nothing
    Set MyFile = Nothing
    Propriétés = aPropName

    Set Shl = Nothing
    Set Rep = Nothing
    Set fich = Nothing
End Function