如何获取‘我的文档’的显示名称

honkerhero 2010-06-25 10:01:38
如何获取‘我的文档’的显示名称?在不同语言版本的系统中,它的显示是不一样的

中文系统叫‘我的文档’
英文系统叫‘my documents‘

类似的有’我的电脑/My computer‘。。。。。

我觉得这东西应该是存在系统中某个地方,但不知道如何获取


那位大侠指点一下,获取路径的连接就不要发了,帮顶就好。谢谢
...全文
489 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
混乱之序 2012-11-29
  • 打赏
  • 举报
回复
插个话题啊! 本机电脑写的一个服务 一个控制台程序 同样的代码Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 为什么 一个得到Administrator下的我的文档 此为正确路径 服务代码里写日志出来的是Default User 我就郁闷了 有日志了下 权限 都是管理员 为什么读出的默认文档不一样了 一台机子。。。
quyun2k4 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 quyun2k4 的回复:]
IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.PERSONAL);
上边这句不能用
IntPtr pPIDL = ShellAPI.GetSpecialFolderLocation(CSIDL.MYDOCUMENTS);
[/Quote]
更正一下,
上边这句不能用→下边这句不能用。
quyun2k4 2010-08-07
  • 打赏
  • 举报
回复
#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楼,学到不少知识。

honkerhero 2010-07-05
  • 打赏
  • 举报
回复
除了读注册表,没人有更好的方法么?
honkerhero 2010-06-29
  • 打赏
  • 举报
回复
把高人顶出来把高人顶出来
真相重于对错 2010-06-25
  • 打赏
  • 举报
回复
简单的方法,
查注册表
honkerhero 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zzyhuian06142 的回复:]

不是在注册表吗
[/Quote]

读注册表似乎可以,但不同的系统可能存在注册表的不同位置,求相关系统API
honkerhero 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 myrroom 的回复:]

引用 5 楼 kevin_cheung 的回复:
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
这个只能获得到路径 名称还真不知道 期待高手

呵呵路径都获取到了还愁名称吗?
名称不就在路径里吗
[/Quote]

那是普通文件夹,‘我的文档’的路径是‘c:\Documents and Settings\Administrator\My Documents’
myrroom 2010-06-25
  • 打赏
  • 举报
回复

System.IO.Path.GetFileName(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
zzyhuian06142 2010-06-25
  • 打赏
  • 举报
回复
不是在注册表吗
myrroom 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kevin_cheung 的回复:]
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
这个只能获得到路径 名称还真不知道 期待高手
[/Quote]
呵呵路径都获取到了还愁名称吗?
名称不就在路径里吗
honkerhero 2010-06-25
  • 打赏
  • 举报
回复
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这个标记对文件夹弄不出来,不知道是不是对文件夹我的用法有问题
xy325432 2010-06-25
  • 打赏
  • 举报
回复
不会,帮你顶下
LovingAlison 2010-06-25
  • 打赏
  • 举报
回复
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
这个只能获得到路径 名称还真不知道 期待高手
lbser 2010-06-25
  • 打赏
  • 举报
回复
帮你顶一下
ddccqq123 2010-06-25
  • 打赏
  • 举报
回复
帮顶啦
hizone911 2010-06-25
  • 打赏
  • 举报
回复
学习学习
ztaimm 2010-06-25
  • 打赏
  • 举报
回复
好吧 帮顶~
spmzfz 2010-06-25
  • 打赏
  • 举报
回复
16楼 的答案难道不可以吗?
honkerhero 2010-06-25
  • 打赏
  • 举报
回复
把高人顶出来
加载更多回复(4)

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧