How to retrieve the Downloads Directory Path in C#
By FoxLearn 1/22/2025 8:40:27 AM 1.28K
Specifically, you can use Environment.SpecialFolder.UserProfile
and then append the Downloads
folder to it.
How to retrieve the Downloads Directory Path in C#?
For example, Using Environment.GetFolderPath with SpecialFolder enumeration.
// c# get folder path with environment getfolderpath string downloadsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // Append "Downloads" to the path downloadsPath = System.IO.Path.Combine(downloadsPath, "Downloads");
In this example:
Environment.GetFolderPath
method retrieves the path to a special system folder specified by theEnvironment.SpecialFolder
enumeration.Environment.SpecialFolder.MyDocuments
represents the My Documents folder for the current user.System.IO.Path.Combine
method combines strings into a path. Here, it's used to append "Downloads" to the end of the My Documents path retrieved.
C# Get folder path
Another way, you can use the win32 api to retrieve the path to the user's Downloads directory. Use the WinAPI method SHGetKnownFolderPath, as it is the intended and correct method for retrieving these paths.
// declare DownloadsFolder GUI and import SHGetKnownFolderPath method 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);
Next, You can create a GetDownloadPath
method to retrieve the Downloads Directory Path in C# as shown below.
// c# get download folder path // returns the absolute downloads directory specified on the system. public static string GetDownloadPath() { if (Environment.OSVersion.Version.Major < 6) throw new NotSupportedException(); IntPtr pathPtr = IntPtr.Zero; try { // c# shgetknownfolderpath directory path SHGetKnownFolderPath(ref folderDownloads, 0, IntPtr.Zero, out pathPtr); return Marshal.PtrToStringUni(pathPtr); } finally { Marshal.FreeCoTaskMem(pathPtr); } }
The Downloads folder is a 'known' folder, along with Documents, Videos, and others.
You can P/Invoke it as shown below (I've included only a few GUIDs that cover the new user folders):
public enum KnownFolder { Contacts, Downloads, Favorites, Links, SavedGames, SavedSearches } public static class KnownFolders { private static readonly Dictionary<KnownFolder, Guid> _guids = new() { [KnownFolder.Contacts] = new("56784854-C6CB-462B-8169-88E350ACB882"), [KnownFolder.Downloads] = new("374DE290-123F-4565-9164-39C4925E467B"), [KnownFolder.Favorites] = new("1777F761-68AD-4D8A-87BD-30B759FA33DD"), [KnownFolder.Links] = new("BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968"), [KnownFolder.SavedGames] = new("4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4"), [KnownFolder.SavedSearches] = new("7D1D3A04-DEBB-4115-95CF-2F29DA2920DA") }; // c# shgetknownfolderpath directory path public static string GetPath(KnownFolder knownFolder) { return SHGetKnownFolderPath(_guids[knownFolder], 0); } [DllImport("shell32", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)] private static extern string SHGetKnownFolderPath( [MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, nint hToken = 0); }
Here’s an example of how to retrieve the path of the Downloads folder:
string downloadsPath = KnownFolders.GetPath(KnownFolder.Downloads); Console.WriteLine($"Downloads folder path: {downloadsPath}");
In older versions of Windows (like Windows 7 and earlier), the Downloads folder might not have been as clearly defined as a separate folder, and it could be considered part of the My Documents structure.
Starting from Windows 8, there is a specific Environment.SpecialFolder.Downloads
enumeration value that directly points to the Downloads folder, but it's good practice to append "Downloads" to Environment.SpecialFolder.MyDocuments
for compatibility with older systems.
Using KnownFolders
(Windows 8.1 and later)
If you are targeting Windows 8.1 or later, you can use the Windows.Storage
API (which is part of UWP) to retrieve special folders like Downloads.
using System; using Windows.Storage; class Program { static async Task Main() { // Retrieve the Downloads folder in Windows 8.1 and later StorageFolder downloadsFolder = KnownFolders.Downloads; Console.WriteLine("Downloads Folder: " + downloadsFolder.Path); } }
Through this example, I hope your application retrieves the correct Downloads directory path across different versions of Windows.
- How to fix 'Failure sending mail' in C#
- How to Parse a Comma-Separated String from App.config in C#
- How to convert a dictionary to a list in C#
- How to retrieve the Executable Path in C#
- How to validate an IP address in C#
- C# Tutorial
- Dictionary with multiple values per key in C#
- How to start, stop and verify if a service exists in C#