Come si fa a livello di codice per scaricare la cartella di download di Windows “% USERPROFILE% / Download”?

In .Net possiamo recuperare i percorsi di “cartelle speciali”, come Documenti / Desktop, ecc. Oggi ho cercato di trovare un modo per ottenere il percorso della cartella “Download”, ma non è abbastanza speciale.

So che posso solo fare ‘C: \ Users \ Username \ Downloads’, ma questa sembra una brutta soluzione. Quindi, come posso recuperare il percorso utilizzando .Net?

Il problema della tua prima risposta è che ti darebbe un risultato ERRATO se la Dir Download predefinita è stata cambiata in [Download1]! Il modo corretto per farlo copre tutte le possibilità è

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

Per testarlo, se desideri specificamente la tua dir personale per il download, contrassegna come predefinito false ->

 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 riga Environment.ExpandEnvironmentVariables () -> (la soluzione più semplice).

 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ì, è speciale, scoprendo che il nome di questa cartella non è diventato ansible fino a Vista. .NET deve ancora supportare i sistemi operativi precedenti. È ansible sospingere SHGetKnownFolderPath () per ignorare questa limitazione, in questo modo:

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

Ho usato il codice seguente e funziona con .net 4.6 con Windows 7 e versioni successive. Il codice seguente fornisce il percorso della cartella del profilo utente -> "C:\Users\"

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

Accanto ad accedere alla cartella dei download basta combinare le stringhe di percorso aggiuntive come di seguito:

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

Ora, il risultato finale sarà

 "C:\Users\\Downloads\" 

Spero che risparmi tempo per qualcuno in futuro.

provare:

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

è solo un trucco, non una soluzione.

Per VB, prova …

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