Search code examples
c#openfiledialog

How do I set the Initial Directory on an OpenFileDIalog to the users `Downloads` folder in C#


Ok so I have an OpenFileDialog and I want to set the initial directory to the users 'Download' folder. This is an internal application and, therefore, I am sure that the user will be using 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;

I have tried the above so far and neither work. No Exception is thrown, it just doesn't set the initial directory to the downloads folder.

Where am I going wrong?

Thanks


Solution

  • Maybe this could help: https://stackoverflow.com/a/1175250/333404

    UPDATE:

    Works for me: 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);