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 или ниже.