The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
using System;
using Microsoft.Win32;

namespace RegFileTypes
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	class RegFileTypes
	{
		public RegFileTypes()
		{
		}

		public void Run()
		{
			RegistryKey root = Registry.ClassesRoot;
			PrintFileTypes( root );
		}

		public void PrintFileTypes( RegistryKey root )
		{
			if( root == null ) return;
			string[] subkeys = root.GetSubKeyNames();
			foreach( string subname in subkeys )
			{
				// For each key, if it starts with . then it's a file type.
				// Otherwise, ignore it.
				if( subname == null ) continue;
				if( !subname.StartsWith(".") ) continue;

				// Open the key and find its default value.
				// If no default, skip this key, since it effectively 
				// doesn't have an assigned type.
				RegistryKey subkey = root.OpenSubKey( subname );
				if( subkey == null ) continue;
				string typename = (string) subkey.GetValue( "" );
				if( typename == null ) continue; // No default value

				// If it has a value "Content Type", that's the mime type.
				string mimetype = null;
				mimetype = (string) subkey.GetValue( "Content Type" );

				// Find the descriptor type.
				RegistryKey typekey = root.OpenSubKey( typename );
				if( typekey == null ) continue;
				string displayName = (string) typekey.GetValue( "" );

				// Find the default icon.
				RegistryKey iconkey = typekey.OpenSubKey( "DefaultIcon" );
				if( iconkey == null ) continue;
				string iconname = (string) iconkey.GetValue( "" );

				// Split the icon descriptor to get the path and the resource ID.
				char[] separators = new char[1];
				separators[0] = ',';
				string[] iconparts = null;
				if( iconname != null ) 
					iconparts = iconname.Split( separators );

				string iconfile = "";
				string iconres = "";
				if( iconparts != null && iconparts.Length <= 2 )
				{
					iconfile = iconparts[0];
					if( iconparts.Length == 2 ) iconres = iconparts[1];
				}

				Console.WriteLine( "Extension:      "+subname );
				Console.WriteLine( "  Type:         "+typename );
				Console.WriteLine( "  MimeType:     "+mimetype );
				Console.WriteLine( "  DisplayName:  "+displayName );
				Console.WriteLine( "  IconDesc:     "+iconname );
				
				// Needs checking.
				//Console.WriteLine( "  Icon:         "+iconfile );
				//Console.WriteLine( "  IconResource: "+iconres );
				Console.WriteLine( "" );
			}
		}

		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			try
			{
				RegFileTypes types = new RegFileTypes();
				types.Run();
			}
			catch( Exception e )
			{
				Console.WriteLine( ""+e.GetType().Name+": "+e.Message );
				Console.WriteLine( e.StackTrace );
			}
		}
	}
}