Получить общий путь к рабочему столу in.NET

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

раньше я просто использовал Environment.GetFolderPath(Environment.SpecialFolder.Desktop). Есть несколько общих папок в SpecialFolder перечисление, но общий рабочий стол, похоже, не существует. Я что-то упускаю, или мне нужно P/invoke SHGetSpecialFolderPath С CSIDL_COMMON_DESKTOPDIRECTORY?

5 ответов


Я думаю, вы должны использовать SHGetSpecialFolderPath API, так как нет значения перечисления для "CommonDesktopDirectory". Вы не можете явно использовать значение CSIDL_COMMON_DESKTOPDIRECTORY и Environment.SpecialFolder, потому что GetFolderPath метод проверяет, что значение в перечисление. Вот код GetFolderPath метод (от рефлектор) :

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;
}

Так вы можете легко скопировать и приспособить часть которая вам...


для уточнения-под общим рабочим столом Вы имеете в виду C:\Documents а настройки\все пользователи\рабочий стол?

если да, то это уродливый Хак -

Dim c As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
Dim comDesktop As String = c.Substring(0, c.LastIndexOf("\")) + "\Desktop"

вы можете использовать Windows Script Host-WshShell.Особых папок

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


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

using IWshRuntimeLibrary;

object commonUserDesktop = "AllUsersDesktop";
WshShell shell = new WshShellClass();
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString();

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell папки, общий рабочий стол