Как мне установить Исходный каталог на OpenFileDIalog для папки `Downloads` пользователя в C # - PullRequest
6 голосов
/ 18 марта 2012

Хорошо, поэтому у меня есть OpenFileDialog, и я хочу установить начальный каталог в папку «Download» пользователя.Это внутреннее приложение, и поэтому я уверен, что пользователь будет использовать Windows 7.

var ofd = new OpenFileDialog();

//This doesn't work
ofd.InitialDirectory =
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Downloads");

//This doesn't work either
ofd.InitialDirectory = @"%USERPROFILE%\Downloads";

ofd.Filter = "Zip Files|*.zip";

ofd.ShowDialog();

txtFooBar.Text = ofd.FileName;

Я пробовал описанное выше, но ни одна из них не работает.Не генерируется никаких исключений, просто не устанавливается начальный каталог в папку загрузок.

Куда я иду?

Спасибо

Ответы [ 4 ]

5 голосов
/ 24 апреля 2015

Я смог использовать среду для непосредственного вызова, но мне пришлось добавить ToString() в конец. Это не сработало, пока я его не добавил.

saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop).ToString();
5 голосов
/ 18 марта 2012

Может быть, это может помочь: https://stackoverflow.com/a/1175250/333404

UPDATE

У меня работает: https://stackoverflow.com/a/3795159/333404

  private void Button_Click_1(object sender, RoutedEventArgs e) {
            var ofd = new OpenFileDialog();
            ofd.InitialDirectory = GetDownloadsPath();
            ofd.Filter = "Zip Files|*.zip";
            ofd.ShowDialog();
        }

        public static string GetDownloadsPath() {
            string path = null;
            if (Environment.OSVersion.Version.Major >= 6) {
                IntPtr pathPtr;
                int hr = SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr);
                if (hr == 0) {
                    path = Marshal.PtrToStringUni(pathPtr);
                    Marshal.FreeCoTaskMem(pathPtr);
                    return path;
                }
            }
            path = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal));
            path = Path.Combine(path, "Downloads");
            return path;
        }

        private static Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path);
0 голосов
/ 18 марта 2012

Папка Загрузки имеет локализованное имя, и в любом случае никогда не стоит предполагать конкретное относительное расположение хорошо известной папки (даже если она хорошо документирована), поскольку она может быть также изменена пользовательскими настройками. .

Не повезло, что перечисление 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).

0 голосов
/ 18 марта 2012

попробуйте

ofd.InitialDirectory = @"%USERPROFILE%\My Documents\Downloads";
...