Как определить путь к папке «Загрузить папку» в Windows? - PullRequest
22 голосов
/ 06 октября 2011

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

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

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

* Редактировать : фактически выясняется, что он запускал приложение не на своем компьютере, а на компьютере под управлением Windows Server 2003.

Ответы [ 2 ]

22 голосов
/ 06 октября 2011

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

Однако новая Vista Известная папка API определяет ее с идентификатором 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 / состоит в том, чтобы освободить возвращаемую память с помощью CoTaskMemFree, что идеально подходит для наших нужд.

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

11 голосов
/ 27 сентября 2012

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

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

Нужно следующее пространство имен:

using Microsoft.WindowsAPICodePack.Shell;

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

string downloadsPath = KnownFolders.Downloads.Path;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...