Получить общий путь к рабочему столу в .NET - PullRequest
8 голосов
/ 11 августа 2009

Мне нужно хранить файлы на общем рабочем столе в Windows. Приложение представляет собой очень специальное приложение только для одного специального компьютера (подготовка устройства), поэтому неопытным пользователям было легко найти и изменить файл конфигурации. Теперь мы перешли на домен, и поскольку разные люди (с разными учетными записями) должны использовать программное обеспечение, оно должно быть в общем месте, которое видит каждый пользователь. Поэтому, пожалуйста, не спрашивайте, почему это на рабочем столе;)

Раньше я просто использовал Environment.GetFolderPath(Environment.SpecialFolder.Desktop). В перечислении SpecialFolder есть несколько общих папок, но общего рабочего стола, похоже, там нет. Я что-то упустил или мне нужно п / вызвать SHGetSpecialFolderPath с CSIDL_COMMON_DESKTOPDIRECTORY?

Ответы [ 5 ]

2 голосов
/ 11 августа 2009

Я думаю, что вы должны использовать API SHGetSpecialFolderPath, так как для "CommonDesktopDirectory" нет значения enum. Вы не можете явно использовать значение 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;
}

Таким образом, вы можете легко скопировать и адаптировать нужную деталь ...

0 голосов
/ 11 августа 2009

Другой способ (да, он также ужасен и будет работать, вероятно, только в Windows XP, а не в Vista) это прочитать значение из реестра

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки оболочки, общий рабочий стол

0 голосов
/ 11 августа 2009

Сначала добавьте ссылку на «Объектную модель хоста скриптов Windows». Вы найдете это на вкладке COM диалогового окна «Добавить ссылки».

using IWshRuntimeLibrary;

object commonUserDesktop = "AllUsersDesktop";
WshShell shell = new WshShellClass();
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString();
0 голосов
/ 11 августа 2009

Вы можете использовать Windows Script Host - WshShell.SpecialFolders

http://msdn.microsoft.com/en-us/library/0ea7b5xe(VS.85).aspx

0 голосов
/ 11 августа 2009

Для пояснения. Под общим рабочим столом вы подразумеваете 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"
...