我需要将文件存储到Windows上的公共桌面。该应用程序是一个非常特殊的应用程序,适用于一个特殊的PC(设备准备),因此非技术用户必须很容易找到并修改配置文件。现在我们切换到一个域,因为不同的人(具有不同的帐户)应该使用该软件,它必须在一个共同的位置,每个用户都可以看到。所以请不要问为什么它在桌面上;)
以前,我刚刚使用过Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
。 SpecialFolder
枚举中有几个常见文件夹,但普通桌面似乎不存在。我错过了什么,或者我是否必须使用SHGetSpecialFolderPath
来调用CSIDL_COMMON_DESKTOPDIRECTORY
?
答案 0 :(得分:2)
我认为您必须使用SHGetSpecialFolderPath
API,因为“CommonDesktopDirectory”没有枚举值。您无法显式使用CSIDL_COMMON_DESKTOPDIRECTORY
的值并将其强制转换为Environment.SpecialFolder
,因为GetFolderPath
方法会检查该值是否已在枚举中定义。这是GetFolderPath
方法的代码(来自Reflector):
public static string GetFolderPath(SpecialFolder folder)
{
if (!Enum.IsDefined(typeof(SpecialFolder), folder))
{
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, GetResourceString("Arg_EnumIllegalVal"), new object[] { (int) folder }));
}
StringBuilder lpszPath = new StringBuilder(260);
Win32Native.SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, lpszPath);
string path = lpszPath.ToString();
new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand();
return path;
}
因此,您可以轻松复制和调整您需要的部分......
答案 1 :(得分:0)
澄清 - 通用桌面是指C:\ Documents and Settings \ All Users \ Desktop?
如果是的话,这是一个丑陋的黑客 -
Dim c As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
Dim comDesktop As String = c.Substring(0, c.LastIndexOf("\")) + "\Desktop"
答案 2 :(得分:0)
您可以使用Windows脚本宿主 - WshShell.SpecialFolders
http://msdn.microsoft.com/en-us/library/0ea7b5xe(VS.85).aspx
答案 3 :(得分:0)
首先,添加对“Windows脚本宿主对象模型”的引用。您可以在“添加引用”对话框的COM选项卡中找到它。
using IWshRuntimeLibrary;
object commonUserDesktop = "AllUsersDesktop";
WshShell shell = new WshShellClass();
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString();
答案 4 :(得分:0)
另一种方式(是的它也很难看,可能只在Windows XP上工作,而不是在Vista上) 是从注册表中读取值
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell文件夹,公用桌面