Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
这个只能获得到路径   名称还真不知道 期待高手

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.IO;
    using System.Runtime.InteropServices;public static class ShellAPI
    {
        [DllImport("shell32.dll", EntryPoint = "ExtractIcon", CharSet = CharSet.Auto)]
        private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
        [DllImport("shell32.dll", EntryPoint = "SHGetSpecialFolderLocation", ExactSpelling = true, CharSet = CharSet.Ansi)]
        private static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, CSIDL nFolder, out IntPtr pPIDL);
        [DllImport("shell32.dll", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = CharSet.Auto)]
        private static extern IntPtr SHGetFileInfo(string pszPath, FileAttributes dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, SHGetInfos uFlags);
        [DllImport("shell32.dll", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = CharSet.Auto)]
        private static extern IntPtr SHGetFileInfo(IntPtr pPIDL, int dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, SHGetInfos uFlags);
        [DllImport("user32.dll", EntryPoint = "DestroyIcon", CharSet = CharSet.Auto)]
        private static extern bool DestroyIcon(IntPtr hIcon);    /// <summary>
        /// 获取在浏览器中显示的图档,例如桌面,我的电脑
        /// </summary>
        /// <param name="hInst"></param>
        /// <param name="sIocn"></param>
        /// <returns></returns>
        public static Icon GetSystemIcon(/*IntPtr hInst, */SystemIcons sIocn)
        {
            IntPtr hIcon = ExtractIcon(IntPtr.Zero, @"C:\WINDOWS\Explorer.exe", (int)sIocn);
            Icon icon = (Icon)Icon.FromHandle(hIcon).Clone();
            DestroyIcon(hIcon);
            return icon;
        }    /// <summary>
        /// 获取指定文件夹或文件的大图标
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Icon GetLargeIcon(string path)
        {
            SHFileInfo fInfo = new SHFileInfo();        SHGetFileInfo(path, (FileAttributes)0, ref fInfo, Marshal.SizeOf(fInfo),
            SHGetInfos.ICON | SHGetInfos.LARGEICON);
            try
            {
                Icon icon = (Icon)Icon.FromHandle(fInfo.hIcon).Clone();
                DestroyIcon(fInfo.hIcon);            return icon;
            }
            catch
            {
                return null;
            }
        }    /// <summary>
        /// 获取指定文件夹或文件的小图标
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Icon GetSmallIcon(string path)
        {
            SHFileInfo fInfo = new SHFileInfo();        SHGetFileInfo(path, (FileAttributes)0, ref fInfo, Marshal.SizeOf(fInfo),
            SHGetInfos.ICON | SHGetInfos.SMALLICON);
            try
            {
                Icon icon = (Icon)Icon.FromHandle(fInfo.hIcon).Clone();
                DestroyIcon(fInfo.hIcon);            return icon;
            }
            catch
            {
                return null;
            }
        }    /// <summary>
        /// 获取特殊文件的内存句柄
        /// </summary>
        /// <param name="nFolder"></param>
        /// <returns></returns>
        public static IntPtr GetSpecialFolderLocation(CSIDL nFolder)
        {
            IntPtr tempPIDL = IntPtr.Zero;
            SHGetSpecialFolderLocation(IntPtr.Zero, nFolder, out tempPIDL);
            return tempPIDL;
        }    /// <summary>
        /// 获取我的电脑的显示名称(不同语言版本显示不同)
        /// </summary>
        /// <returns></returns>
        public static string GetMyComputerName()
        {
            IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.DRIVES);
            SHFileInfo fInfo = new SHFileInfo();        SHGetFileInfo(pPIDL, 0, ref fInfo, Marshal.SizeOf(fInfo),
            SHGetInfos.PIDL | SHGetInfos.DISPLAYNAME | SHGetInfos.TYPENAME);        return fInfo.szDisplayName;
        }

    }/// <summary>
    /// 在Windows浏览器里使用的图标
    /// </summary>
    public enum SystemIcons
    {
        MyComputer,
        Search,
        Printer,
        Desktop,
        InvalidPrinter,
        Unknow,
        UnemptyRecycle,
        Information,
        Warning,
        Error,
        What,
        DoubleLeftArrow,
        DoubleRightArrow,
        OpenedFolder,
        Earth,
        Envelope,
        WordEnvelope,
        Taskbar
    }/// <summary>
    /// 特殊文件的IDL值
    /// </summary>
    public enum CSIDL
    {
        ADMINTOOLS = 0x30,
        ALTSTARTUP = 0x1D,
        APPDATA = 0x1A,
        BITBUCKET = 0xA,
        CDBURN_AREA = 0x3B,
        COMMON_ADMINTOOLS = 0x2F,
        COMMON_ALTSTARTUP = 0x1E,
        COMMON_APPDATA = 0x23,
        COMMON_DESKTOPDIRECTORY = 0x19,
        COMMON_DOCUMENTS = 0x2E,
        COMMON_FAVORITES = 0x1F,
        COMMON_MUSIC = 0x35,
        COMMON_PICTURES = 0x36,
        COMMON_PROGRAMS = 0x17,
        COMMON_STARTMENU = 0x16,
        COMMON_STARTUP = 0x18,
        COMMON_TEMPLATES = 0x2D,
        COMMON_VIDEO = 0x37,
        CONTROLS = 3,
        COOKIES = 0x21,
        DESKTOP = 0,
        DESKTOPDIRECTORY = 0x10,
        DRIVES = 0x11,                  //My Computer
        FAVORITES = 6,
        FLAG_CREATE = 0x8000,
        FONTS = 0x14,
        HISTORY = 0x22,
        INTERNET = 1,
        INTERNET_CACHE = 0x20,
        LOCAL_APPDATA = 0x1C,
        MYDOCUMENTS = 12,
        MYMUSIC = 13,
        MYPICTURES = 0x27,
        MYVIDEO = 14,
        NETHOOD = 0x13,
        NETWORK = 0x12,
        PERSONAL = 5,
        PRINTERS = 4,
        PRINTHOOD = 0x1B,
        PROFILE = 0x28,
        PROFILES = 0x3E,
        PROGRAM_FILES = 0x26,
        PROGRAM_FILES_COMMON = 0x2B,
        PROGRAMS = 2,
        RECENT = 8,
        SENDTO = 9,
        STARTMENU = 0xB,
        STARTUP = 7,
        SYSTEM = 0x25,
        TEMPLATES = 0x15,
        WINDOWS = 0x24
    }[StructLayout(LayoutKind.Sequential, CharSet= CharSet.Auto)]
    internal struct SHFileInfo
    {
        public IntPtr hIcon;
        public int iIcon;
        public SHFileAttributes dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szTypeName;
    }[Flags]
    public enum SHFileAttributes : uint
    {
        BROWSABLE = 0x8000000,
        CANCOPY = 1,
        CANDELETE = 0x20,
        CANLINK = 4,
        CANMONIKER = 0x400000,
        CANMOVE = 2,
        CANRENAME = 0x10,
        CAPABILITYMASK = 0x177,
        COMPRESSED = 0x4000000,
        CONTENTSMASK = 0x80000000,
        DISPLAYATTRMASK = 0xfc000,
        DROPTARGET = 0x100,
        ENCRYPTED = 0x2000,
        FILESYSANCESTOR = 0x10000000,
        FILESYSTEM = 0x40000000,
        FOLDER = 0x20000000,
        GHOSTED = 0x8000,
        HASPROPSHEET = 0x40,
        HASSTORAGE = 0x400000,
        HASSUBFOLDER = 0x80000000,
        HIDDEN = 0x80000,
        ISSLOW = 0x4000,
        LINK = 0x10000,
        NEWCONTENT = 0x200000,
        NONENUMERATED = 0x100000,
        READONLY = 0x40000,
        REMOVABLE = 0x2000000,
        SHARE = 0x20000,
        STORAGE = 8,
        STORAGEANCESTOR = 0x800000,
        STORAGECAPMASK = 0x70c50008,
        STREAM = 0x400000,
        VALIDATE = 0x1000000
    }[Flags]
    internal enum SHGetInfos : int
    {
        ICON = 0x000000100,             // get icon
        DISPLAYNAME = 0x000000200,      // get display name
        TYPENAME = 0x000000400,         // get type name
        ATTRIBUTES = 0x000000800,       // get attributes
        ICONLOCATION = 0x000001000,     // get icon location
        EXETYPE = 0x000002000,          // return exe type
        SYSICONINDEX = 0x000004000,     // get system icon index
        LINKOVERLAY = 0x000008000,      // put a link overlay on icon
        SELECTED = 0x000010000,         // show icon in selected state
        ATTR_SPECIFIED = 0x000020000,   // get only specified attributes
        LARGEICON = 0x000000000,        // get large icon
        SMALLICON = 0x000000001,        // get small icon
        OPENICON = 0x000000002,         // get open icon
        SHELLICONSIZE = 0x000000004,    // get shell size icon
        PIDL = 0x000000008,             // pszPath is a pidl
        USEFILEATTRIBUTES = 0x000000010,// use passed dwFileAttribute
        ADDOVERLAYS = 0x000000020,      // apply the appropriate overlays
        OVERLAYINDEX = 0x000000040      // Get the index of the overlay
    }标红的代码能获取到‘我的电脑’的显示文本,但对其它系统文件夹拿不到,似乎SHGetInfos.DISPLAYNAME这个标记对文件夹弄不出来,不知道是不是对文件夹我的用法有问题
      

  2.   


    System.IO.Path.GetFileName(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
      

  3.   


    那是普通文件夹,‘我的文档’的路径是‘c:\Documents and Settings\Administrator\My Documents’
      

  4.   


    读注册表似乎可以,但不同的系统可能存在注册表的不同位置,求相关系统API
      

  5.   


                foreach (Environment.SpecialFolder folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
                {
                    Console.Write(folder.ToString().PadRight(23, ' '));      
                    Console.WriteLine(Environment.GetFolderPath(folder));
                } 
      

  6.   

    #7楼的代码里我加了一个方法可以获得 "我的文档" 显示的名称internal static string GetMyDocumentName()
        {
            IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.PERSONAL);
            SHFileInfo fInfo = new SHFileInfo();        SHGetFileInfo(pPIDL, 0, ref fInfo, Marshal.SizeOf(fInfo),
            SHGetInfos.PIDL | SHGetInfos.DISPLAYNAME | SHGetInfos.TYPENAME);        return fInfo.szDisplayName;
        }
    IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.PERSONAL);
    上边这句不能用
    IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.MYDOCUMENTS);代表的意义不一样
    CSIDL_MYDOCUMENTS = 0x000c,    // logical "My Documents" desktop icon 其实是个图标
    CSIDL_PERSONAL           = 0x0005,    // My Documents感谢#7楼,学到不少知识。
      

  7.   

    插个话题啊!
    本机电脑写的一个服务 一个控制台程序
    同样的代码Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    为什么 一个得到Administrator下的我的文档 此为正确路径 服务代码里写日志出来的是Default User
    我就郁闷了 有日志了下 权限 都是管理员 为什么读出的默认文档不一样了
    一台机子