Estou tentando descobrir como ler / gravar nas propriedades estendidas do arquivo em C #, por exemplo, comentário, taxa de bits, data de acesso, categoria etc. que você pode ver no Windows Explorer. Alguma idéia de como fazer isso? EDITAR: Estarei principalmente lendo / gravando em arquivos de vídeo (AVI / DIVX / ...)
c#
extended-properties
David Hayes
fonte
fonte
Respostas:
Para quem não gosta de VB, aqui está em c #:
Observe que você deve adicionar uma referência a Controles e automação do Microsoft Shell na guia COM da caixa de diálogo Referências.
fonte
Há um artigo CodeProject para um leitor ID3. E um tópico em kixtart.org que tem mais informações para outras propriedades. Basicamente, você precisa chamar o
GetDetailsOf()
método no objeto de shell da pasta parashell32.dll
.fonte
Solução 2016
Adicione os seguintes pacotes NuGet ao seu projeto:
Microsoft.WindowsAPICodePack-Shell
pela MicrosoftMicrosoft.WindowsAPICodePack-Core
pela MicrosoftPropriedades de leitura e gravação
Importante:
O arquivo deve ser válido, criado pelo software específico atribuído. Cada tipo de arquivo tem propriedades de arquivo estendidas específicas e nem todos são graváveis.
Se você clicar com o botão direito do mouse em um arquivo na área de trabalho e não conseguir editar uma propriedade, não será possível editá-lo no código também.
Exemplo:
Author
ouTitle
.Portanto, certifique-se de usar alguns
try
catch
Tópico adicional: MSDN: Implementando Manipuladores de Propriedades
fonte
Este exemplo em VB.NET lê todas as propriedades estendidas:
Você deve adicionar uma referência a Controles e automação do Microsoft Shell na guia COM da caixa de diálogo Referências .
fonte
Obrigado pessoal por este tópico! Isso me ajudou quando eu queria descobrir a versão de um arquivo exe. No entanto, eu mesmo precisava descobrir a última parte do que é chamado de Propriedades estendidas.
Se você abrir as propriedades de um arquivo exe (ou dll) no Windows Explorer, obterá uma guia Versão e uma visualização das Propriedades estendidas desse arquivo. Eu queria acessar um desses valores.
A solução para isso é o indexador de propriedade FolderItem.ExtendedProperty e se você descartar todos os espaços no nome da propriedade, obterá o valor. Por exemplo, a versão do arquivo se torna FileVersion, e aí está.
Espero que isso ajude mais alguém, apenas pensei em adicionar esta informação a este tópico. Felicidades!
fonte
GetDetailsOf()
Método - recupera detalhes sobre um item em uma pasta. Por exemplo, seu tamanho, tipo ou a hora de sua última modificação. As propriedades do arquivo podem variar de acordo com aWindows-OS
versão.fonte
Folder rFolder = shell.NameSpace(_rootPath);
. Para sua informação, estou usando o sistema operacional Windows 8.Usar:
Funcionará em versões do Windows como o Windows server 2008, onde você obterá o erro "Não foi possível lançar o objeto COM do tipo 'System .__ ComObject' para o tipo de interface 'Shell32.Shell'" se apenas tentar criar o objeto Shell32 normalmente.
fonte
shell
para qualquer uma dasIShellDispatch
interfaces (1-6) e chamar o membro diretamente.Shell32.IShellDispatch ishell = (Shell32.IShellDispatch)shell; Shell32.Folder shellFolder = ishell.NameSpace(baseFolder);
A resposta de Jerker é um pouco mais simples. Aqui está um exemplo de código que funciona da MS :
Para aqueles que não podem fazer referência ao shell32 estaticamente, você pode invocá-lo dinamicamente desta forma:
fonte
Não tenho certeza para quais tipos de arquivos você está tentando escrever as propriedades, mas taglib-sharp é uma excelente biblioteca de etiquetagem de código aberto que engloba todas essas funcionalidades de maneira adequada. Ele tem muito suporte integrado para a maioria dos tipos de arquivos de mídia populares, mas também permite que você faça marcações mais avançadas com praticamente qualquer arquivo.
EDIT: Eu atualizei o link para taglib sharp. O link antigo não funcionava mais.
EDIT: Atualizado o link mais uma vez com o comentário de kzu.
fonte
Aqui está uma solução para ler - não escrever - as propriedades estendidas com base no que encontrei nesta página e na ajuda com objetos shell32 .
Para ficar claro, isso é um hack. Parece que esse código ainda será executado no Windows 10, mas chegará a algumas propriedades vazias. A versão anterior do Windows deve usar:
No Windows 10, presumimos que haja cerca de 320 propriedades para ler e simplesmente ignoramos as entradas vazias:
Conforme mencionado, você precisa fazer referência ao assembly Com Interop.Shell32.
Se você obtiver uma exceção relacionada ao STA, encontrará a solução aqui:
Exceção ao usar Shell32 para obter propriedades estendidas de arquivo
Não tenho ideia de como seriam esses nomes de propriedades em um sistema estrangeiro e não consegui encontrar informações sobre quais constantes localizáveis usar para acessar o dicionário. Também descobri que nem todas as propriedades da caixa de diálogo Propriedades estavam presentes no dicionário retornado.
Aliás, isso é terrivelmente lento e - pelo menos no Windows 10 - analisar datas na string recuperada seria um desafio, portanto, usar isso parece uma má ideia para começar.
No Windows 10, você definitivamente deve usar a biblioteca Windows.Storage que contém SystemPhotoProperties, SystemMusicProperties etc. https://docs.microsoft.com/en-us/windows/uwp/files/quickstart-getting-file-properties
E, finalmente, postei uma solução muito melhor que usa WindowsAPICodePack lá
fonte