/// <summary> /// Method attempts to find that parent of a known folder by looking at the /// ParentId field in the associated <see cref="KnownFolderProperties"/> object /// and returns the new parent and child <see cref="IdList"/>s on success. /// </summary> /// <param name="ashellListId"></param> /// <param name="parentList"></param> /// <param name="relativeChild"></param> /// <returns>True if known folder parent was available in ParentId field, /// otherwise false.</returns> public static bool GetParentChildIdList(IdList ashellListId , out IdList parentList , out IdList relativeChild) { parentList = null; relativeChild = null; relativeChild = ashellListId.GetRelativeChildId(); parentList = ashellListId.GetParentId(); // Get Parent Id which is always the first part minus last id in the sequence if (parentList != null) { return(true); } // Try to find parent through known folder information lookup using (KnownFolderNative kf = KnownFolderHelper.FromPIDL(ashellListId)) { if (kf != null) { var props = KnownFolderHelper.GetFolderProperties(kf.Obj); if (props.Parent != null) { if ((parentList = IdList.FromKnownFolderGuid(props.ParentId)) != null) { return(true); } } } } // Just return the desktop as parent if the given item has no more parents using (var desktop = KnownFolderHelper.FromKnownFolderGuid(new Guid(KF_ID.ID_FOLDERID_Desktop))) { IntPtr desktopPtr = default(IntPtr); try { desktopPtr = desktop.KnownFolderToPIDL(); if (desktopPtr != default(IntPtr)) { parentList = IdList.Create(PidlManager.Decode(desktopPtr)); return(true); } } finally { if (desktopPtr != default(IntPtr)) { desktopPtr = PidlManager.ILFree(desktopPtr); } } } return(false); }
/// <summary> /// Converts a <see cref="IdList"/> formated PIDL representation /// into a path (parse name) representation 'C:\'. /// </summary> /// <param name="idList"></param> /// <param name="pathType"></param> /// <returns></returns> public static string GetPathFromPIDL(IdList idList, TypOfPath pathType) { IntPtr pidl = PidlManager.IdListToPidl(idList); try { return(PidlManager.GetPathFromPIDL(pidl, pathType)); } finally { Marshal.FreeCoTaskMem(pidl); } }
/// <summary> /// Gets the display name for a given <see cref="IdList"/> based PIDL. /// </summary> /// <returns>the display name as string</returns> public static string GetPidlDisplayName(IdList item) { IntPtr pidl = PidlManager.IdListToPidl(item); try { return(PidlManager.GetPidlDisplayName(pidl)); } finally { Marshal.FreeCoTaskMem(pidl); } }
/// <summary> /// Gets the parent IdList (parent PIDL) if available and a /// relative child idList (relative child PIDL). /// </summary> /// <param name="originalPath"></param> /// <param name="parentList"></param> /// <param name="relativeChild"></param> /// <returns></returns> public static bool GetParentIdListFromPath(string originalPath , out IdList parentList , out IdList relativeChild) { parentList = null; relativeChild = null; if (string.IsNullOrEmpty(originalPath)) { return(false); } // Desktop is the root of the shell and does not have a parent if (originalPath.Equals(KF_IID.ID_FOLDERID_Desktop, StringComparison.InvariantCultureIgnoreCase)) { return(true); } IntPtr apidl = default(IntPtr); try { // Decode the pidl for this path into a list of ShellIds apidl = PidlManager.GetPIDLFromPath(originalPath); if (apidl == default(IntPtr)) // Cannot resolve this PIDL { return(false); } // Convert PIDL into list of shellids and remove last id var ashellListId = PidlManager.Decode(apidl); return(GetParentChildIdList(IdList.Create(ashellListId), out parentList, out relativeChild)); } finally { apidl = PidlManager.ILFree(apidl); } }
/// <summary> /// Converts a given FULL <see cref="IdList"/> based PIDL into a name /// (display name or parse name etc). /// /// A Pidl is considered FULL if it can be resolved /// underneath the desktop root item. That is, a relativeChild PIDL /// from another parent (eg.: C: drive) cannot be resolved here and /// results in null being returned. /// </summary> /// <param name="idListPidl"></param> /// <param name="parseOption"></param> /// <returns>Returns the requested string or null if <paramref name="idListPidl"/> /// cannot be resolved underneath the Desktop root item.</returns> public static string IdListFullToName(IdList idListPidl, SHGDNF parseOption) { using (var desktopShellFolder = new ShellFolderDesktop()) { IntPtr pidl = default(IntPtr); try { pidl = PidlManager.IdListToPidl(idListPidl); if (pidl != default(IntPtr)) { string parseName = desktopShellFolder.GetShellFolderName(pidl, parseOption); return(parseName); } } finally { Marshal.FreeCoTaskMem(pidl); } } return(null); }
/// <summary> /// Returns an <see cref="IdList"/> (PIDL) for a known folder given a /// globally unique identifier. /// </summary> /// <param name="knownfolderId">A GUID for the requested known folder.</param> /// <returns>A known folder representing the specified name.</returns> /// <exception cref="System.ArgumentException">Thrown if the given Known Folder ID is invalid.</exception> public static IdList FromKnownFolderGuid(Guid knownfolderId) { using (KnownFolderNative KF = KnownFolderHelper.FromKnownFolderGuid(knownfolderId)) { if (KF != null) { IntPtr parentPidl = default(IntPtr); try { parentPidl = KF.KnownFolderToPIDL(); // Convert PIDL into list of shellids and remove last id return(IdList.Create(PidlManager.Decode(parentPidl))); } finally { parentPidl = PidlManager.ILFree(parentPidl); } } } return(null); }