Подтвердить что ты не робот

Как определить путь к папке "Загрузить папку Windows"?

На моей машине это здесь:

string downloadsPath = Path.Combine(
   Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
   "Downloads");

Но на компьютере коллег эта папка не существует, а папка "Загрузки" находится в папке "Мои документы". Мы оба на Windows 7 *.

* Изменить: на самом деле оказалось, что он не запускал приложение на своей машине, а на компьютере с Windows Server 2003.

4b9b3361

Ответ 1

Windows не определяет CSIDL для папки "Загрузки", и она недоступна через Environment.SpecialFolder перечисление.

Однако новый API Vista Известная папка определяет его с идентификатором FOLDERID_Downloads. Вероятно, самым простым способом получения фактического значения является P/invoke SHGetKnownFolderPath.

public static class KnownFolder
{
    public static readonly Guid Downloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
}

[DllImport("shell32.dll", CharSet=CharSet.Unicode)]
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out string pszPath);

static void Main(string[] args)
{
    string downloads;
    SHGetKnownFolderPath(KnownFolder.Downloads, 0, IntPtr.Zero, out downloads);
    Console.WriteLine(downloads);
}

Обратите внимание, что P/invoke, указанный на pinvoke.net, неверен, поскольку он не может использовать набор символов Unicode. Также я воспользовался тем фактом, что этот API возвращает память, выделенную COM-распределителем. Маршаллинг по умолчанию для P/invoke выше - освободить возвращенную память с помощью CoTaskMemFree, которая идеально подходит для наших нужд.

Будьте осторожны, что это Vista и API вверх и не пытайтесь вызвать его на XP/2003 или ниже.

Ответ 2

Вы можете использовать Код Windows API Code Pack для Microsoft.NET Framework.

Ссылка: Microsoft.WindowsAPICodePack.Shell.dll

Требуется следующее пространство имен:

using Microsoft.WindowsAPICodePack.Shell;

Простое использование:

string downloadsPath = KnownFolders.Downloads.Path;