110 votes

Lecture/écriture des propriétés de fichiers "étendus" (C#)

J'essaie de trouver comment lire/écrire dans les propriétés étendues du fichier en C#. par exemple, Commentaire, Débit binaire, Date d'accès, Catégorie, etc. que vous pouvez voir dans l'explorateur Windows. Avez-vous une idée de la façon de procéder ? EDIT : Je vais principalement lire/écrire dans des fichiers vidéo (AVI/DIVX/...).

4 votes

Cette question est clairement pas puisque la réponse acceptée ne montre que comment obtenir les propriétés étendues et les propriétés de l'entreprise. pas comment les définir .

1 votes

Pour définir les propriétés étendues, voir stackoverflow.com/questions/5337683/

89voto

csharptest.net Points 16556

Pour ceux qui n'aiment pas trop le VB, voici la version en c# :

Notez que vous devez ajouter une référence à Contrôles et automatisation de Microsoft Shell dans 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)}");
        }
    }
}

3 votes

Comment définir l'une de ces valeurs ? Par exemple, l'auteur ou l'éditeur d'un fichier .txt. Je suis sur win 7 et j'ai utilisé ceci et il montre un auteur et un éditeur vides et 282 autres propriétés.

2 votes

@Vainbhav - Vous ne pouvez pas les définir.

27 votes

Vous devez ajouter une référence à Microsoft Shell Controls and Automation à partir de l'onglet COM de la boîte de dialogue Refences.

27voto

Mark Cidade Points 53945

Il y a un article de CodeProject pour un lecteur ID3. Et un fil à kixtart.org qui contient plus d'informations pour les autres propriétés. En gros, vous devez appeler le GetDetailsOf() méthode en el dossier objet shell pour shell32.dll .

0 votes

Merci, je devrais être capable de rassembler ce dont j'ai besoin à partir de ça.

25voto

0xA3 Points 73439

Cet exemple en 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 à Contrôles et automatisation de Microsoft Shell de la COM de l'onglet Références dialogue.

2 votes

Il est intéressant de noter que sous Windows 7 (au moins), vous pouvez augmenter la taille de arrHeaders à un peu plus de 280 et obtenir de nombreuses métadonnées supplémentaires. J'ai découvert cela lorsque je cherchais un moyen d'obtenir des méta-données à partir d'un fichier WTV (émission de télévision enregistrée par Windows 7 Media Center).

1 votes

La première boucle for i = 0 à 34 devrait être for i = 0 à Integer.MaxValue. Testez ensuite la valeur de retour de objFolder.GetDetailsOf(objFolder.Items, i). Si elle renvoie null ou un espace blanc, vous avez tous les en-têtes.

0 votes

@TimMurphy, malheureusement, ce n'est pas correct (du moins sous Windows 10 ou 7). Certains en-têtes sont vides, vous devez donc parcourir tous les index en boucle. (Bien sûr, comme il n'y en a pas des millions, vous pourriez limiter la boucle à 1 000).

8voto

RJK Points 1661

GetDetailsOf() Méthode - Permet de récupérer les détails d'un élément dans un dossier. Par exemple, sa taille, son type ou l'heure de sa dernière modification. Les propriétés du dossier peuvent varier en fonction du Windows-OS version.

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);
 }

0 votes

J'ai copié et utilisé le même code ci-dessus. Mais, j'obtiens une exception COM au moment de l'exécution ici Folder rFolder = shell.NameSpace(_rootPath); . Pour info, j'utilise le système d'exploitation Windows 8.

1 votes

Quelle est cette erreur ? Vérifiez que vous utilisez la bonne version de Shell32.dll. Vérifiez ceci, c'est peut-être utile

1 votes

+1 pour le lien ci-dessus. Le lien que vous avez suggéré fonctionne bien. J'ai besoin d'une aide supplémentaire de votre part, c'est-à-dire, comment puis-je passer le fichier unique pour obtenir les métadonnées ? car, il accepte de passer seulement le dossier.

8voto

JERKER Points 138

Merci les gars pour ce fil de discussion ! Il m'a aidé lorsque j'ai voulu déterminer la version d'un fichier exe. Cependant, j'avais besoin de déterminer moi-même la dernière partie de ce que l'on appelle les propriétés étendues.

Si vous ouvrez les propriétés d'un fichier exe (ou dll) dans l'Explorateur Windows, 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, File Version devient FileVersion, et voilà.

J'espère que cela aidera quelqu'un d'autre, j'ai juste pensé que je devais ajouter cette information à ce fil. A la vôtre !

2 votes

Cela garantit également que votre code fonctionnera (du moins en grande partie) sur les machines non anglophones.

1 votes

Une petite amélioration ici, FolderItem ne contient pas ExtendedProperty(). En revanche, FolderItem2 le contient.

0 votes

Cette réponse est un peu plus simple que les autres. J'ai donné un exemple de code qui fonctionne ici : stackoverflow.com/a/46648086/661933

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X