Próbuję dowiedzieć się, jak odczytywać / zapisywać rozszerzone właściwości pliku w C #, np. Komentarz, szybkość transmisji, data dostępu, kategoria itp., Które można zobaczyć w Eksploratorze Windows. Jakieś pomysły, jak to zrobić? EDYCJA: Będę głównie czytać / zapisywać do plików wideo (AVI / DIVX / ...)
c#
extended-properties
David Hayes
źródło
źródło
Odpowiedzi:
Dla tych, którzy nie mają bzika na punkcie VB, oto w C #:
Zauważ, że musisz dodać odwołanie do Microsoft Shell Controls and Automation z karty COM w oknie dialogowym References.
źródło
Jest artykuł w CodeProject dla czytnika ID3. I wątek na kixtart.org, który zawiera więcej informacji na temat innych nieruchomości. Zasadniczo musisz wywołać
GetDetailsOf()
metodę w obiekcie powłoki folderu dlashell32.dll
.źródło
Rozwiązanie 2016
Dodaj następujące pakiety NuGet do projektu:
Microsoft.WindowsAPICodePack-Shell
przez MicrosoftMicrosoft.WindowsAPICodePack-Core
przez MicrosoftWłaściwości odczytu i zapisu
Ważny:
Plik musi być prawidłowy, utworzony przez określone przypisane oprogramowanie. Każdy typ pliku ma określone rozszerzone właściwości pliku i nie wszystkie z nich są zapisywalne.
Jeśli klikniesz prawym przyciskiem myszy plik na pulpicie i nie możesz edytować właściwości, nie będziesz w stanie edytować jej również w kodzie.
Przykład:
Author
aniTitle
właściwości.Więc po prostu upewnij się, że używasz niektórych
try
catch
Dalszy temat: MSDN: wdrażanie programów obsługi właściwości
źródło
Ten przykład w VB.NET odczytuje wszystkie rozszerzone właściwości:
Musisz dodać odwołanie do Microsoft Shell Controls and Automation na karcie COM w oknie dialogowym References .
źródło
Dziękuję wam za ten wątek! Pomogło mi to, gdy chciałem dowiedzieć się, jaka jest wersja pliku exe. Musiałem jednak sam wymyślić ostatnią część tego, co nazywa się rozszerzonymi właściwościami.
Jeśli otworzysz właściwości pliku exe (lub dll) w Eksploratorze Windows, pojawi się karta Wersja i widok Właściwości rozszerzonych tego pliku. Chciałem uzyskać dostęp do jednej z tych wartości.
Rozwiązaniem tego problemu jest indeksator właściwości FolderItem.ExtendedProperty i jeśli usuniesz wszystkie spacje w nazwie właściwości, otrzymasz wartość. Np. File Version przechodzi w FileVersion i gotowe.
Mam nadzieję, że to pomoże komukolwiek innemu, pomyślałem, że dodam te informacje do tego wątku. Twoje zdrowie!
źródło
GetDetailsOf()
Metoda - pobiera szczegółowe informacje o elemencie w folderze. Na przykład jego rozmiar, typ lub czas ostatniej modyfikacji. Właściwości pliku mogą się różnić w zależności odWindows-OS
wersji.źródło
Folder rFolder = shell.NameSpace(_rootPath);
. FYI, używam systemu operacyjnego Windows 8.Posługiwać się:
Będzie działać na wersjach systemu Windows, takich jak Windows Server 2008, gdzie pojawi się błąd „Nie można rzutować obiektu COM typu„ System .__ ComObject ”na interfejs typu„ Shell32.Shell ””, jeśli próbujesz tylko normalnie utworzyć obiekt Shell32.
źródło
shell
na dowolny zIShellDispatch
interfejsów (1-6) i bezpośrednio wywołać członka.Shell32.IShellDispatch ishell = (Shell32.IShellDispatch)shell; Shell32.Folder shellFolder = ishell.NameSpace(baseFolder);
Odpowiedź Jerkera jest trochę prostsza. Oto przykładowy kod, który działa z MS :
Dla tych, którzy nie mogą statycznie odwoływać się do shell32, możesz wywołać go dynamicznie w następujący sposób:
źródło
Nie jestem pewien, dla jakich typów plików próbujesz zapisać właściwości, ale taglib-ostry to doskonała biblioteka tagowania typu open source, która ładnie zawiera wszystkie te funkcje. Ma wiele wbudowanej obsługi większości popularnych typów plików multimedialnych, ale pozwala także na bardziej zaawansowane tagowanie z prawie każdym plikiem.
EDYTOWAĆ: Zaktualizowałem link do taglib sharp. Stary link już nie działał.
EDYCJA: Ponownie zaktualizowano link zgodnie z komentarzem kzu.
źródło
Oto rozwiązanie do czytania - a nie pisania - rozszerzonych właściwości na podstawie tego, co znalazłem na tej stronie i przy pomocy obiektów shell32 .
Żeby było jasne, to jest hack. Wygląda na to, że ten kod będzie nadal działał w systemie Windows 10, ale trafi na niektóre puste właściwości. Poprzednia wersja systemu Windows powinna używać:
W systemie Windows 10 zakładamy, że jest około 320 właściwości do odczytania i po prostu pomijamy puste wpisy:
Jak wspomniano, musisz odwołać się do zestawu Com Interop.Shell32.
Jeśli otrzymasz wyjątek związany z STA, rozwiązanie znajdziesz tutaj:
Wyjątek w przypadku używania Shell32 do uzyskania rozszerzonych właściwości pliku
Nie mam pojęcia, jakie nazwy właściwości wyglądałyby w obcym systemie i nie mogłem znaleźć informacji o tym, które stałe lokalizowalne użyć, aby uzyskać dostęp do słownika. Odkryłem również, że nie wszystkie właściwości z okna dialogowego Właściwości były obecne w zwróconym słowniku.
BTW jest to strasznie powolne i - przynajmniej w Windows 10 - analizowanie dat w pobranym ciągu byłoby wyzwaniem, więc używanie tego wydaje się być złym pomysłem na początek.
W systemie Windows 10 zdecydowanie powinieneś użyć biblioteki Windows.Storage, która zawiera SystemPhotoProperties, SystemMusicProperties itp. Https://docs.microsoft.com/en-us/windows/uwp/files/quickstart-getting-file-properties
I wreszcie, pisał o wiele lepsze rozwiązanie, które używa WindowsAPICodePack tam
źródło