public static IKnownFolder FromParsingName(string parsingName)
{
IntPtr pidl = IntPtr.Zero, pidl2 = IntPtr.Zero;
if (parsingName == null) throw new ArgumentNullException("parsingName");
try
{
pidl = Shell32.PidlFromParsingName(parsingName);
if (pidl == IntPtr.Zero)
{
throw new ArgumentException("Parsing Name", "parsingName");
}
// It's probably a special folder, try to get it
IKnownFolderNative knownFolderNative = KnownFolderHelper.FromPIDL(pidl);
if (knownFolderNative != null)
{
IKnownFolder kf = KnownFolderHelper.GetKnownFolder(knownFolderNative);
if (kf == null)
throw new ArgumentException("Parsing Name", "parsingName");
else
return kf;
}
// No physical storage was found for this known folder
// We'll try again with a different name
// try one more time with a trailing \0
pidl2 = Shell32.PidlFromParsingName(parsingName.PadRight(1, '\0'));
if (pidl2 == IntPtr.Zero)
{
throw new ArgumentException("Parsing Name", "parsingName");
}
IKnownFolderNative nativeKnownFolder = KnownFolderHelper.FromPIDL(pidl);
IKnownFolder kf2 = null;
if (nativeKnownFolder != null)
{
kf2 = KnownFolderHelper.GetKnownFolder(nativeKnownFolder);
if (kf2 == null)
{
throw new ArgumentException("Parsing Name", "parsingName");
}
}
return kf2;
}
finally
{
Shell32.ILFree(pidl);
Shell32.ILFree(pidl2);
}
}
}