Папка Загрузки имеет локализованное имя, и в любом случае никогда не стоит предполагать конкретное относительное расположение хорошо известной папки (даже если она хорошо документирована), поскольку она может быть также изменена пользовательскими настройками. .
Не повезло, что перечисление SpecialFolder
не содержит всех известных папок, поэтому вам нужно немного поработать, см. MSDN . На этой странице мы можем найти полный список известных папок , который вы ищете FOLDERID_Downloads , потому что для функции SHGetKnownFolderPath требуется GUID, который вам необходим объявите где-нибудь эту константу. Ваш код будет выглядеть примерно так:
static class ShellHelpers
{
public static string GetDownloadsFolder()
{
string path;
int result = SHGetKnownFolderPath(FOLDERID_Downloads, 0, IntPtr.Zero, out path);
if (result != NOERROR)
Marshal.ThrowExceptionForHR(result); // You may fallback to another method or folder
return path;
}
private static readonly Guid FOLDERID_Downloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
private static readonly int NOERROR = 0;
[DllImport("shell32.dll", CharSet=CharSet.Unicode)]
private static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out string pszPath);
}
Обратите внимание, что вы можете использовать предпочитаемую вами подпись P / Invoke (кто-то использует StringBuilder, кто-то другой - IntPtr).