.net environment-variables registry registrykey special-folders

.net - ¿Cómo derivar mediante programación la carpeta de descargas de Windows “% USERPROFILE%/Downloads”?



environment-variables registry (5)

El problema de su primera respuesta es que le daría un resultado INCORRECTO si el Dir. De Descargas predeterminado se ha cambiado 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 específicamente desea su dirección de descarga personal, marca el valor predeterminado como 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 }

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 parece que sea lo suficientemente especial.

Sé que solo puedo hacer ''C: / Users / Nombre de usuario / Descargas'', pero eso parece una solución fea. Entonces, ¿cómo puedo recuperar el camino usando .Net?


Para VB, intente ...

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


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

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


Utilicé el siguiente código y funciona para .net 4.6 con Windows 7 y superior. El siguiente código proporciona la ruta de la carpeta del perfil de usuario -> "C:/Users/<username>"

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

Junto a la carpeta de descargas, solo tiene que combinar cadenas de ruta adicionales como se muestra a continuación:

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

Ahora, el resultado final será

"C:/Users/<username>/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 solución.