Como derivar programaticamente a pasta de downloads do Windows “% USERPROFILE% / Downloads”?

No .net podemos recuperar os caminhos para ‘pastas especiais‘, como documentos / desktop etc. Hoje eu tentei encontrar uma maneira de obter o caminho para a pasta ‘Downloads’, mas não é especial o suficiente, parece.

Eu sei que posso apenas fazer ‘C: \ Users \ Username \ Downloads’, mas isso parece uma solução feia. Então, como posso recuperar o caminho usando .net?

O problema da sua primeira resposta é que você teria um resultado ERRADO se o diretório de downloads padrão fosse alterado para [Download1]! A maneira correta de fazer isso cobrindo todas as possibilidades é

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 testá-lo, se você deseja especificamente seu diretório de download pessoal, você sinaliza o padrão 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 } 

Ou apenas uma linha Environment.ExpandEnvironmentVariables () -> (a solução mais simples).

 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 } 

Sim, é especial, descobrir o nome desta pasta não foi possível até o Vista. O .NET ainda precisa suportar sistemas operacionais anteriores. Você pode pinvoke SHGetKnownFolderPath () para ignorar essa limitação, como este:

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

Eu usei o código abaixo e funciona para .net 4.6 com o Windows 7 e acima. O código abaixo fornece o caminho da pasta de perfil de usuário -> "C:\Users\"

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

Ao lado de acessar a pasta de downloads, basta combinar strings de caminho adicionais, conforme abaixo:

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

Agora, o resultado final será

 "C:\Users\\Downloads\" 

Espero que economize tempo para alguém no futuro.

experimentar:

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

é apenas um truque, não uma solução.

Para VB, tente …

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