{"id":21070828,"url":"https://github.com/fafalone/propertydump","last_synced_at":"2025-05-16T05:31:14.063Z","repository":{"id":151901677,"uuid":"551892141","full_name":"fafalone/PropertyDump","owner":"fafalone","description":"Dump all file properties","archived":false,"fork":false,"pushed_at":"2024-03-03T14:44:56.000Z","size":4438,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-03T20:43:11.550Z","etag":null,"topics":["file-properties","twinbasic","windows","windows-shell"],"latest_commit_sha":null,"homepage":"","language":"Visual Basic 6.0","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fafalone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-15T10:26:34.000Z","updated_at":"2024-01-28T23:05:50.000Z","dependencies_parsed_at":"2024-03-03T15:48:00.802Z","dependency_job_id":null,"html_url":"https://github.com/fafalone/PropertyDump","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fafalone%2FPropertyDump","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fafalone%2FPropertyDump/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fafalone%2FPropertyDump/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fafalone%2FPropertyDump/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fafalone","download_url":"https://codeload.github.com/fafalone/PropertyDump/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254473971,"owners_count":22077201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["file-properties","twinbasic","windows","windows-shell"],"created_at":"2024-11-19T18:48:30.393Z","updated_at":"2025-05-16T05:31:09.055Z","avatar_url":"https://github.com/fafalone.png","language":"Visual Basic 6.0","readme":"# PropDumper - File Property/Metadata Dumper\n![Screenshot](https://i.imgur.com/jYWgtYA.jpg)\n\nThis program will create a dump of all properties and metadata visible to Explorer which aren't blank for the given file.\n\nYou can create these output files with the specified extension, in the same folder where the file resides or a central folder. If the output already exists, there's an option to rename to the next available name the same way Windows does, File (1).txt, File (2).txt, whatever number is available.\n\nProperties include hidden Unicode codepoints indicating whether it's left to right or right to left; I usually view text in Notepad with Western script instead of Unicode, so I find it useful to remove these. So that option is there.\n\nThis will not go into zip/cab files, even though Windows considers them folders now.\n\nThis is all done by using the Windows Property System (IPropertyStore et al), which is the system that underlies how all the properties are displayed in Explorer-- so you're able to list exactly what Explorer is, without having to worry about having to derive things like image width/height yourself. If Explorer can see it, it will be in the dump. Note: Some properties like Office are derived through 64bit shell extensions that won't load into 32bit apps; so if you want to make sure it's an identical representation, use the 64bit build for 64bit Windows.\n\nThis program was created in [twinBASIC](https://github.com/twinbasic/twinbasic), an actual successor to VB6/VBA. It's very far along at this point; language compatibility is nearly complete, and basic Forms with most of the default controls can be created, ActiveX control support is decent (but can't use .ctl controls yet). It can compile 64bit exes using VBA7/64 syntax from Office, and in addition there's a bunch of new features bringing the language into this century. You'll see the splash screen for it in the x64 build as I don't currently have a paid subscription (and that splash screen is currently the only limitation of free version). \n\nOne of the new features is defining COM interfaces locally; I made this project primarily to test things in my [tbShellLib library](https://github.com/fafalone/tbShellLib), a collection of Windows shell interfaces and other COM components that's a 64bit compatible successor my [oleexp.tlb](https://www.vbforums.com/showthread.php?786079-VB6-Modern-Shell-Interface-Type-Library-oleexp-tlb) project for VB6. Note that this is why the source code file is so large; it imports the entire library. Which is quite expansive.\n\n(Note that since this project uses new language features in tB, it would take some work to backport it to VB6-- tB is backwards compatible, not forwards compatible, just like VBA7x64 isn't compatible with 32bit VBA6 or VB6). \n\n## Requirements\nWindows 7+\n\nSource and binaries are self-contained, no installation or additional dependencies.\n\nBuilding from source requires [twinBASIC Beta 147](https://github.com/twinbasic/twinbasic/releases) or newer.\n\n## SOURCE CODE NOTES\n\nFor anyone unfamiliar with twinBASIC source code structure, it combines all source into a single file. The .twinproj file in the root above is the complete source code; it's large because it includes the library dependencies- tbShellLib (my project) and the twinBASIC WinNativeForms package that create the Forms/Controls, as well as the program icon and manifest. You can browse the local project source code to this program itself in the SourceBrowse folder, but you need the .twinproj file to open and compile it yourself in twinBASIC. You can also browse the source for tbShellLib [in it's repository](https://github.com/fafalone/tbShellLib).\n\n## Dumping properties\n\nWindows shell interfaces and Property System make dumping properties very easy:\n\n```\nPrivate Sub DumpFileProperties(siFile As IShellItem, sName As String)\n    Dim sOut As String\n    Dim lpPath As LongPtr, sPath As String\n    siFile.GetDisplayName SIGDN_FILESYSPATH, lpPath\n    sPath = LPWSTRtoStr(lpPath)\n\n    \n    sOut = \"Filename: \" \u0026 sName \u0026 vbCrLf\n    sOut \u0026= \"File full path: \" \u0026 sPath \u0026 vbCrLf\n\n    Dim si2 As IShellItem2\n    Dim pps As IPropertyStore\n    Dim ppd As IPropertyDescription\n    Dim lpFmt As LongPtr, sPropFmt As String\n    Dim sFileOut As String\n    \n    If bCurDir Then\n        sFileOut = sPath \u0026 sExt\n    Else\n        sFileOut = sPathOut \u0026 sExt\n    End If\n    If PathFileExistsW(sFileOut) Then\n        If chkRename.Value = vbChecked Then\n            sFileOut = UniqueNameInSeq(sFileOut)\n        Else\n            AppendLog \"Skipping \" \u0026 sName \u0026 \"; output file exists.\"\n            Exit Sub\n        End If\n    End If\n    \n    Set si2 = siFile\n    si2.GetPropertyStore GPS_DEFAULT Or GPS_BESTEFFORT Or GPS_OPENSLOWITEM, IID_IPropertyStore, pps\n    If (pps Is Nothing) = False Then\n        Dim nMax As Long\n        pps.GetCount nMax\n        If nMax Then\n        \tAppendLog \"Dumping \" \u0026 nMax \u0026 \" properties for \" \u0026 sName \u0026 \"...\"\n                \n            Dim i As Long\n            Dim pk As PROPERTYKEY\n            Dim lpProp As LongPtr, sProp As String\n            Dim lpPropC As LongPtr, sPropC As String\n            Dim lpPropN As LongPtr, sPropN As String\n            For i = 0 To nMax - 1\n                pps.GetAt i, pk\n                If pk.fmtid.Data1 \u003c\u003e 0 Then\n                    PSGetPropertyDescription pk, IID_IPropertyDescription, ppd\n                    If (ppd Is Nothing) = False Then\n                        ppd.GetDisplayName lpPropN\n                        sPropN = LPWSTRtoStr(lpPropN)\n                        ppd.GetCanonicalName lpPropC\n                        sPropC = LPWSTRtoStr(lpPropC)\n                        PSFormatPropertyValue ObjPtr(pps), ObjPtr(ppd), PDFF_DEFAULT, lpProp\n                        sProp = LPWSTRtoStr(lpProp)\n                        If bRemoveFmt Then RemoveFormatChars(sProp)\n                        If sProp \u003c\u003e \"\" Then sOut \u0026= sPropN \u0026 \" (\" \u0026 sPropC \u0026 \")=\" \u0026 sProp \u0026 vbCrLf\n                    Else\n                        Debug.Print \"Couldn't get propdesc for \" \u0026 dbg_PKEYToString(pk)\n                    End If\n                End If\n            Next i\n        Else\n            sOut \u0026= \"No properties listed for file.\"\n        End If\n    Else\n        AppendLog \"Couldn't open property store for \" \u0026 sPath\n        sOut \u0026= \"Couldn't open property store for this file.\"\n    End If\n    \n\n    WriteStrToFile sOut, sFileOut\n    nCount = nCount + 1\nEnd Sub\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffafalone%2Fpropertydump","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffafalone%2Fpropertydump","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffafalone%2Fpropertydump/lists"}