¿Cómo derivar programáticamente la carpeta de descargas de Windows “% USERPROFILE% / Downloads”?

En .Net podemos recuperar las rutas a ‘carpetas especiales’, como Documentos / Escritorio, etc. Hoy traté de encontrar una manera de obtener la ruta a la carpeta ‘Descargas’, pero no es lo suficientemente especial como parece.

Sé que puedo hacer ‘C: \ Users \ Username \ Downloads’, pero parece una solución fea. Entonces, ¿cómo puedo recuperar el camino usando .Net?

¡El problema de su primera respuesta es que le daría un resultado INCORRECTO si la Dir. De Descargas predeterminada ha sido cambiada a [Descarga1]! La forma correcta de hacerlo cubriendo todas las posibilidades es

using System; using System.Runtime.InteropServices; static class cGetEnvVars_WinExp { [DllImport("Shell32.dll")] private static extern int SHGetKnownFolderPath( [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr ppszPath); [Flags] public enum KnownFolderFlags : uint { SimpleIDList = 0x00000100 , NotParentRelative = 0x00000200, DefaultPath = 0x00000400, Init = 0x00000800 , NoAlias = 0x00001000, DontUnexpand = 0x00002000, DontVerify = 0x00004000 , Create = 0x00008000,NoAppcontainerRedirection = 0x00010000, AliasOnly = 0x80000000 } public static string GetPath(string RegStrName, KnownFolderFlags flags, bool defaultUser) { IntPtr outPath; int result = SHGetKnownFolderPath ( new Guid(RegStrName), (uint)flags, new IntPtr(defaultUser ? -1 : 0), out outPath ); if (result >= 0) { return Marshal.PtrToStringUni(outPath); } else { throw new ExternalException("Unable to retrieve the known folder path. It may not " + "be available on this system.", result); } } } 

Para probarlo, si desea específicamente su directorio de descarga personal, marca por defecto a falso ->

 using System.IO; class Program { [STAThread] static void Main(string[] args) { string path2Downloads = string.Empty; path2Downloads = cGetEnvVars_WinExp.GetPath("{374DE290-123F-4565-9164-39C4925E467B}", cGetEnvVars_WinExp.KnownFolderFlags.DontVerify, false); string[] files = { "" }; if (Directory.Exists(path2Downloads)) { files = Directory.GetFiles(path2Downloads); } }//Main } 

O solo una línea Environment.ExpandEnvironmentVariables () -> (la solución más simple).

 using System.IO; class Program { /* https://ss64.com/nt/syntax-variables.html */ [STAThread] static void Main(string[] args) { string path2Downloads = string.Empty; string[] files = { "" }; path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"); if (Directory.Exists(path2Downloads)) { files = Directory.GetFiles(path2Downloads); } }//Main } 

Sí, es especial, descubrir el nombre de esta carpeta no fue posible hasta Vista. .NET aún necesita admitir sistemas operativos anteriores. Puede pinvoke SHGetKnownFolderPath () para eludir esta limitación, como esta:

 using System.Runtime.InteropServices; ... public static string GetDownloadsPath() { if (Environment.OSVersion.Version.Major < 6) throw new NotSupportedException(); IntPtr pathPtr = IntPtr.Zero; try { SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr); return Marshal.PtrToStringUni(pathPtr); } finally { Marshal.FreeCoTaskMem(pathPtr); } } 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); 

Usé el siguiente código y funciona para .net 4.6 con Windows 7 y superior. El siguiente código muestra la ruta de la carpeta del perfil de usuario -> "C:\Users\"

 string userProfileFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

A continuación para acceder a la carpeta de descargas, simplemente combine cadenas de ruta adicionales de la siguiente manera:

 string DownloadsFolder = userProfileFolder + "\\Downloads\\"; 

Ahora, el resultado final será

 "C:\Users\\Downloads\" 

Espero que ahorre tiempo para alguien en el futuro.

tratar:

 Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites) Dim downloD As String = Dd.Replace("Favorites", "Downloads") txt1.text = downLoD 

es solo un truco, no una solución.

Para VB, intente …

 Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\"