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