//! \file Shell.cs //! \date Tue Aug 02 13:48:55 2011 //! \brief Win32 shell functions. // // Copyright (C) 2011 by poddav // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // using System; using System.Text; using System.Runtime.InteropServices; namespace Rnd.Shell { /// /// Wrapper around PathCreateFromUrl WINAPI call. /// class PathConverter { [DllImport("shlwapi.dll", EntryPoint="PathCreateFromUrlW", CharSet=CharSet.Unicode, SetLastError=true)] private static extern Int32 PathCreateFromUrl( string url, StringBuilder path, ref Int32 size, UInt32 flags); private StringBuilder buf; private Int32 size; public PathConverter (int capacity = 260) { buf = new StringBuilder (capacity); } public string UrlToPath (string url) { size = buf.Capacity; Int32 rc = PathCreateFromUrl (url, buf, ref size, 0); return rc == 0 ? buf.ToString (0, size) : ""; } } /// /// Wrapper around SHGetFileInfo WINAPI call. /// class FileInfo { [DllImport("shell32.dll", CharSet=CharSet.Auto)] public static extern IntPtr SHGetFileInfo( string pszPath, Int32 dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags); [DllImport("User32.dll")] public static extern int DestroyIcon(IntPtr hIcon); [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] public struct SHFILEINFO { public IntPtr hIcon; public int iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; public SHFILEINFO(bool b) { hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = ""; } }; [Flags] public enum SHGFI : uint { /// get icon Icon = 0x000000100, /// get display name DisplayName = 0x000000200, /// get type name TypeName = 0x000000400, /// get attributes Attributes = 0x000000800, /// get icon location IconLocation = 0x000001000, /// return exe type ExeType = 0x000002000, /// get system icon index SysIconIndex = 0x000004000, /// put a link overlay on icon LinkOverlay = 0x000008000, /// show icon in selected state Selected = 0x000010000, /// get only specified attributes Attr_Specified = 0x000020000, /// get large icon LargeIcon = 0x000000000, /// get small icon SmallIcon = 0x000000001, /// get open icon OpenIcon = 0x000000002, /// get shell size icon ShellIconSize = 0x000000004, /// pszPath is a pidl PIDL = 0x000000008, /// use passed dwFileAttribute UseFileAttributes= 0x000000010, /// apply the appropriate overlays AddOverlays = 0x000000020, /// Get the index of the overlay in the upper 8 bits of the iIcon OverlayIndex = 0x000000040, } public static string GetTypeName (string filename) { SHFILEINFO info = new SHFILEINFO(true); int szInfo = Marshal.SizeOf (info); int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)SHGFI.TypeName); // If uFlags does not contain SHGFI_EXETYPE or SHGFI_SYSICONINDEX, // the return value is nonzero if successful, or zero otherwise. if (result != 0) return info.szTypeName; else return string.Empty; } public static SHFILEINFO? GetInfo (string filename, SHGFI flags) { SHFILEINFO info = new SHFILEINFO(true); int szInfo = Marshal.SizeOf (info); int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)flags); return result != 0? new Nullable (info): null; } } /// /// Wrapper around MoveFileEx WINAPI call. /// class File { [DllImport("kernel32.dll", EntryPoint="MoveFileExW", SetLastError=true, CharSet=CharSet.Unicode)] public static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); [Flags] public enum MoveFileFlags : uint { ReplaceExisting = 0x00000001, CopyAllowed = 0x00000002, DelayUntilReboot = 0x00000004, WriteThrough = 0x00000008, CreateHardlink = 0x00000010, FailIfNotTrackable = 0x00000020 } public static bool Rename (string szFrom, string szTo) { return MoveFileEx (szFrom, szTo, MoveFileFlags.ReplaceExisting); } } }