Lire / écrire les propriétés du fichier 'Extended' (C#)

j'essaie de trouver comment lire/écrire sur les propriétés du fichier étendu dans C# par exemple commentaire, débit binaire, Date D'accès, catégorie etc que vous pouvez voir dans l'Explorateur de Windows. Aucune idées de comment faire cela? EDIT: je vais principalement lire/écrire dans des fichiers vidéo (AVI/DIVX/...)

88
demandé sur Mark Hurd 2008-10-21 01:56:10

9 réponses

pour ceux de pas fou de VB, voici en c#:

Note, vous devez ajouter une référence à Microsoft Shell Controls and Automation à partir de L'onglet COM de la boîte de dialogue Références.

public static void Main(string[] args)
{
    List<string> arrHeaders = new List<string>();

    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder objFolder;

    objFolder = shell.NameSpace(@"C:\temp\testprop");

    for( int i = 0; i < short.MaxValue; i++ )
    {
        string header = objFolder.GetDetailsOf(null, i);
        if (String.IsNullOrEmpty(header))
            break;
        arrHeaders.Add(header);
    }

    foreach(Shell32.FolderItem2 item in objFolder.Items())
    {
        for (int i = 0; i < arrHeaders.Count; i++)
        {
            Console.WriteLine(
              $"{i}\t{arrHeaders[i]}: {objFolder.GetDetailsOf(item, i)}");
        }
    }
}
75
répondu csharptest.net 2017-10-26 13:03:18

Il y a un CodeProject l'article pour un ID3 lecteur. Et un fil à kixtart.org qui contient plus d'information pour d'autres propriétés. Fondamentalement, vous devez appeler le GetDetailsOf() méthode sur le dossier objet shell pour shell32.dll .

27
répondu Mark Cidade 2008-10-20 22:17:24

cet échantillon VB.NET lit toutes les propriétés étendues:

Sub Main()
        Dim arrHeaders(35)

        Dim shell As New Shell32.Shell
        Dim objFolder As Shell32.Folder

        objFolder = shell.NameSpace("C:\tmp")

        For i = 0 To 34
            arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
        Next
        For Each strFileName In objfolder.Items
            For i = 0 To 34
                Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objfolder.GetDetailsOf(strFileName, i))
            Next
        Next

    End Sub

Vous devez ajouter une référence à Microsoft Shell de Commandes et automatismes de la COM de l'onglet Références boîte de dialogue.

24
répondu Dirk Vollmar 2017-10-26 13:04:44

Solution 2016

ajouter les paquets NuGet suivants à votre projet:

  • Microsoft.WindowsAPICodePack-Shell par Microsoft
  • Microsoft.WindowsAPICodePack-Core par Microsoft

Lire et Écrire "Propriétés de la 1519180920"
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

string filePath = @"C:\temp\example.docx";
var file = ShellFile.FromFilePath(filePath);

// Read and Write:

string[] oldAuthors = file.Properties.System.Author.Value;
string oldTitle = file.Properties.System.Title.Value;

file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" };
file.Properties.System.Title.Value = "Example Title";

// Alternate way to Write:

ShellPropertyWriter propertyWriter =  file.Properties.GetPropertyWriter();
propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" });
propertyWriter.Close();

Important:

le fichier doit être valide, créé par le logiciel assigné. Chaque type de fichier a les propriétés spécifiques du fichier étendu ne sont pas toutes accessibles en écriture.

si vous faites un clic droit sur un fichier sur le bureau et que vous ne pouvez pas éditer une propriété, vous ne pourrez pas l'éditer en code aussi.

exemple:

  • créer un fichier txt sur le bureau, renommer son extension en docx. Vous ne pouvez pas modifier sa propriété Author ou Title .
  • ouvrez-le avec Word, éditez et sauvegardez il. Maintenant, vous pouvez.

alors assurez-vous d'utiliser quelques try catch

Autre Sujet: MSDN: la mise en Œuvre de Biens de Gestionnaires d'

19
répondu MA-Maddin 2017-08-03 09:19:19

Merci les gars pour ce fil! Ça m'a aidé quand j'ai voulu trouver la version d'un fichier d'exe. Cependant, j'ai eu besoin de comprendre le dernier morceau moi-même de ce qui est appelé propriétés étendues.

si vous ouvrez propriétés d'un fichier exe (ou dll) dans Windows Explorer, vous obtenez un onglet Version, et une vue des propriétés étendues de ce fichier. Je voulais accéder à l'une de ces valeurs.

la solution à cela est l'indexeur de propriété FolderItem.ExtendedProperty et si vous supprimez tous les espaces dans le nom de la propriété, vous obtiendrez la valeur. Par exemple: La Version de fichier va FileVersion, et là vous l'avez.

espérons que cela aide quelqu'un d'autre, juste pensé que je voudrais ajouter cette information à ce fil. Acclamations!

8
répondu JERKER 2010-08-23 12:25:28

GetDetailsOf() méthode - recherche des détails sur un article dans un dossier. Par exemple, sa taille, son type ou l'Heure de sa dernière modification. Les propriétés des fichiers peuvent varier en fonction de la version Windows-OS .

List<string> arrHeaders = new List<string>();

 Shell shell = new ShellClass();
 Folder rFolder = shell.NameSpace(_rootPath);
 FolderItem rFiles = rFolder.ParseName(filename);

 for (int i = 0; i < short.MaxValue; i++)
 {
      string value = rFolder.GetDetailsOf(rFiles, i).Trim();
      arrHeaders.Add(value);
 }
8
répondu RajeshKdev 2014-10-30 10:40:10

la réponse de Jerker est un peu plus simple. Voici un exemple de code qui fonctionne de MS :

var folder = new Shell().NameSpace(folderPath);
foreach (FolderItem2 item in folder.Items())
{
    var company = item.ExtendedProperty("Company");
    var author = item.ExtendedProperty("Author");
    // Etc.
}

pour ceux qui ne peuvent pas référencer statiquement shell32, vous pouvez l'invoquer dynamiquement comme ceci:

var shellAppType = Type.GetTypeFromProgID("Shell.Application");
dynamic shellApp = Activator.CreateInstance(shellAppType);
var folder = shellApp.NameSpace(folderPath);
foreach (var item in folder.Items())
{
    var company = item.ExtendedProperty("Company");
    var author = item.ExtendedProperty("Author");
    // Etc.
}
4
répondu nawfal 2017-10-13 10:18:02
  • Après avoir examiné un certain nombre de solutions sur ce fil et ailleurs le code suivant a été mis en place. Ce n'est que pour lire une propriété.
  • Je n'ai pas pu obtenir le Shell32.FolderItem2.ExtendedProperty fonction à travailler, il est supposé pour prendre une valeur de chaîne et retourner la valeur correcte et taper pour cela propriété... cela a toujours été nul pour moi et les ressources de référence des développeurs étaient très minces.
  • le WindowsApiCodePack semble pour avoir été abandonné par Microsoft qui nous apporte le code ci-dessous.

Utiliser:

string propertyValue = GetExtendedFileProperty("c:\temp\FileNameYouWant.ext","PropertyYouWant");
  1. vous retournera la valeur du bien étendu que vous voulez comme un chaîne pour le fichier et le nom de la propriété.
  2. boucles seulement jusqu'à ce qu'elle trouve la propriété spécifiée - pas jusqu'à ce que toutes les propriétés sont découvertes comme un exemple de code
  3. Fonctionnera sur les versions de Windows comme Windows server 2008 où vous obtiendrez l'erreur "impossible de lancer objet COM de type 'Système.__ComObject' à l'interface de type " Shell32.Shell '" si vous essayez de créer l'objet Shell32 normalement.

    public static string GetExtendedFileProperty(string filePath, string propertyName)
    {
        string value = string.Empty;
        string baseFolder = Path.GetDirectoryName(filePath);
        string fileName = Path.GetFileName(filePath);
    
        //Method to load and execute the Shell object for Windows server 8 environment otherwise you get "Unable to cast COM object of type 'System.__ComObject' to interface type 'Shell32.Shell'"
        Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
        Object shell = Activator.CreateInstance(shellAppType);
        Shell32.Folder shellFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { baseFolder });
    
        //Parsename will find the specific file I'm looking for in the Shell32.Folder object
        Shell32.FolderItem folderitem = shellFolder.ParseName(fileName);
        if (folderitem != null)
        {
            for (int i = 0; i < short.MaxValue; i++)
            {
                //Get the property name for property index i
                string property = shellFolder.GetDetailsOf(null, i);
    
                //Will be empty when all possible properties has been looped through, break out of loop
                if (String.IsNullOrEmpty(property)) break;
    
                //Skip to next property if this is not the specified property
                if (property != propertyName) continue;    
    
                //Read value of property
                value = shellFolder.GetDetailsOf(folderitem, i);
            }
        }
        //returns string.Empty if no value was found for the specified property
        return value;
    }
    
2
répondu Rohan 2018-04-23 02:19:33

Je ne suis pas sûr de quels types de fichiers vous essayez d'écrire les propriétés, mais taglib-sharp est une excellente bibliothèque de tagging open source qui termine bien toutes ces fonctionnalités. Il a beaucoup de prise en charge intégrée pour la plupart des types de fichiers médias populaires, mais vous permet également de faire plus avancé tagging avec à peu près n'importe quel fichier.

EDIT: j'ai mis à jour le lien vers taglib forte. Le lien n'est plus travaillé.

EDIT: mis à Jour le lien une fois de plus par kzu commentaire.

1
répondu mockobject 2012-01-03 15:47:35