Click here to Skip to main content
13,451,980 members (52,356 online)
Click here to Skip to main content
Add your own
alternative version


68 bookmarked
Posted 21 Sep 2003

ID3 Tag Reader Using Shell Functions

, 21 Sep 2003
Rate this:
Please Sign up or sign in to vote.
Utility to read ID3 tags from MP3 files using Windows Shell functions.


This article describes another alternative for reading and displaying ID3 tags in MP3 files. There are various well documented methods of extracting ID3 tag information from MP3 files available. One of the most useful sites regarding this information is This article will explore the possibility of extracting the same information using Win32 Shell functions.


The Shell32.dll is responsible for a host of functions from launching applications to creating shortcuts and managing printers. You can read more about all the wonderful functionality it offers here. With Windows XP, users get the option of selecting a wide variety of columns to display when Explorer is in "Detail" view. Most of the extra columns are centered around multimedia files such as MP3 tracks and digital pictures. By way of the functionality provided in Shell32.dll, it is possible to display ID3 tag information for MP3 audio files and embedded EXIF information in JPEG picture files.

Using the code

The basic functionality of the ID3 tag reader is implemented as a struct with a single static ReadID3Tags method that returns a user defined MP3File object. It is beneficial to implement legacy COM wrapper functionality in a struct, as struct types get allocated in the heap and hence are exempt from garbage collection. They are also lightweight (compared to object instances), as they relieve the CLR from the task of reference counting.

We begin by adding a reference to Shell32.dll.

The MP3File class is basically a skeleton placeholder for the ID3 information returned from our Shell32 wrapper.

using System;
namespace ShellID3Reader {
    public class MP3File {
        private string fileName;
        private string artistName;
        private string albumName;
        private int trackNumber;
        private string songTitle; 

        public string FileName {
             get{return this.fileName;}
            set{this.fileName = value;}
        public string ArtistName {
            get{return this.artistName;}
            set{this.artistName = value;}
        public string AlbumName {
            get{return this.albumName;}
            set{this.albumName = value;}
        public int TrackNumber {
             get{return this.trackNumber;}
            set{this.trackNumber = value;}
        public string SongTitle {
             get{return this.songTitle;}
            set{this.songTitle = value;}
        public MP3File(){

The ShellID3TagReader struct is responsible for reading the ID3 tags from MP3 files. Its takes the full file path and name as an input parameter and returns an instance of MP3File after decorating its properties, with information extracted from the Windows shell.

using System;
namespace ShellID3Reader
    public struct ShellID3TagReader
        public static MP3File ReadID3Tags(string FileFullPath){
            MP3File mp3File = new MP3File();

            //parse file name
            string fileName = 
            //parse file path
            string filePath = 
            //create shell instance
            Shell32.Shell shell  = new Shell32.ShellClass();
            //set the namespace to file path
            Shell32.Folder folder = shell.NameSpace(filePath);
            //get ahandle to the file
            Shell32.FolderItem folderItem = folder.ParseName(fileName);
            //did we get a handle ?
            if (folderItem !=null){
                mp3File.FileName = fileName;
                //query information from shell regarding file
                mp3File.ArtistName = folder.GetDetailsOf(folderItem,9);
                mp3File.AlbumName = folder.GetDetailsOf(folderItem,17);
                mp3File.SongTitle = folder.GetDetailsOf(folderItem,10);
                mp3File.TrackNumber = 
            //clean ip
            folderItem = null;
            folder = null;
            shell = null;
            //return mp3File instance
            return mp3File;

And finally we add the MP3File instance to a ListView for display.

private void cmdReadTags_Click(object sender, System.EventArgs e) {
    DirectoryInfo dir = new DirectoryInfo(textBoxFilePath.Text);
    FileInfo[] files = dir.GetFiles("*.mp3");
    foreach(FileInfo fi in files){
        MP3File mp3File = ShellID3TagReader.ReadID3Tags(fi.FullName);
        ListViewItem itm = new ListViewItem();
        itm.Text = mp3File.FileName;
        itm.SubItems.Add(mp3File.AlbumName );
        itm.SubItems.Add(mp3File.TrackNumber.ToString()) ;


  • Sept 23 2003 - Initial version (1.0.0)


This article, along with any associated source code and files, is licensed under A Public Domain dedication


About the Author

Erhan Hosca
Web Developer JPMorgan Chase & Co.
United States United States
No Biography provided

You may also be interested in...


Comments and Discussions

QuestionIs there any way to retrieve the year? Pin
tequilalove28-Apr-08 0:28
membertequilalove28-Apr-08 0:28 
AnswerRe: Is there any way to retrieve the year? Pin
Erhan Hosca11-May-08 15:56
memberErhan Hosca11-May-08 15:56 
year is 18 ...

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04-2016 | 2.8.180318.3 | Last Updated 22 Sep 2003
Article Copyright 2003 by Erhan Hosca
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid