JMK
JMK

Reputation: 28059

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

Upvotes: 12

Views: 30910

Answers (6)

Lukas Kock
Lukas Kock

Reputation: 439

I used @tim's answer and it worked fine. Only I used it without the ToString() method and directly with the Path.Combine() method.

private OpenFileDialog openFileDialog;
openFileDialog.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads");

Upvotes: 0

Jun Takeshita
Jun Takeshita

Reputation: 27

Environment.GetEnvironmentVariable("USERPROFILE") + @"" + "Downloads"

Upvotes: -1

Tim Melton
Tim Melton

Reputation: 329

I was able to use the environment to call directly but I had to add ToString() to the end. It didn't work until I added it.

saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

Upvotes: 15

Robar
Robar

Reputation: 1971

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);

Upvotes: 6

Adriano Repetti
Adriano Repetti

Reputation: 67090

The Downloads folder has a localized name and anyway is never a good idea to assume a specific relative location of a well known folder (even if it's well documented) because it may be changed by user settings too.

Unlucky the SpecialFolder enumeration doesn't contain every known folder so you have to use a little bit of interop, see MSDN. From that page we can find the full list of known folders, what you're looking for is FOLDERID_Downloads, because the SHGetKnownFolderPath function requires a GUID you have to declare somewhere that constant. Your code will be then something like this:

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);
}

Please note you can use the P/Invoke signature you prefer (someone uses a StringBuilder, someone else an IntPtr).

Upvotes: 1

PraveenVenu
PraveenVenu

Reputation: 8337

try this

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

Upvotes: -2

Related Questions