É possível definir/editar propriedades estendidas de um arquivo com o Windows API Code Pack?
-
21-12-2019 - |
Pergunta
Gostaria de saber se é possível definir/editar as propriedades estendidas de um arquivo (Explorer:Clique com o botão direito > Propriedades > Detalhes) usando o Windows API Code Pack.
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellObject.FromParsingName(filePath);
var artistName = shellFile.Properties.GetProperty(SystemProperties.System.Music.DisplayArtist).ValueAsObject.ToString();
var duration = TimeSpan.FromMilliseconds(Convert.ToDouble(shellFile.Properties.GetProperty(SystemProperties.System.Media.Duration).ValueAsObject) * 0.0001);
Utilizo essas poucas linhas para obter as propriedades que desejo, mas não sei como editar uma delas (o nome do artista, por exemplo).Eu sei que posso usar taglib-sharp, mas só usarei se não houver solução sem código externo.
Obrigado a todos por dedicarem seu tempo para me ajudar.
Solução
Encontrei uma maneira de editar algumas propriedades com ShellPropertyWriter
mas algumas propriedades são somente leitura.
var shellFile = ShellFile.FromParsingName(filePath);
ShellPropertyWriter w = shellFile.Properties.GetPropertyWriter();
try
{
w.WriteProperty(SystemProperties.System.Author, new string[] { "MyTest", "Test" });
w.WriteProperty(SystemProperties.System.Music.Artist, new string[] { "MyTest", "Test" });
w.WriteProperty(SystemProperties.System.Music.DisplayArtist, "Test");
}
catch (Exception ex)
{
}
w.Close();
Nesta amostra, as 2 primeiras ocorrências de ShellPropertyWriter.WriteProperty()
fará exatamente o mesmo, edite o campo "Artistas colaboradores" do arquivo (Explorer:Clique com o botão direito > Propriedades > Detalhes).A terceira chamada lançará uma exceção de "Acesso negado".Alguns são editáveis, outros não.Só preciso tentar.
Outras dicas
Você pode escrever para o ShellFile
diretamente, definindo o valor das propriedades sem ShellPropertyWriter
:
var shellFile = ShellFile.FromFilePath(filePath);
shellFile.Properties.System.Author.Value = new string[] { "MyTest", "Test" };
shellFile.Properties.System.Music.Artist.Value = new string[] { "MyTest", "Test" };
shellFile.Properties.System.Music.DisplayArtist.Value = "Test";
Esteja ciente de que para poder editar campos específicos do codec de um arquivo, é necessário ter o codec instalado no computador.