Pregunta

En .Net podemos retreive las rutas de acceso a carpetas especiales '', como Documentos / escritorio, etc. Hoy he intentado encontrar una manera de obtener la ruta a la carpeta 'Descargas', pero no es lo suficientemente especial como parece.

Yo sé que sólo puede hacer 'C: \ Users \ Nombre de usuario \ Descargas', pero que parece una solución fea. Entonces, ¿cómo puedo retreive la ruta utilizando .Net?

¿Fue útil?

Solución

El problema de su primera respuesta es que le daría un resultado erróneo si el valor predeterminado Descargas Dir se ha cambiado a [Download1]! 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 probar que, si lo desea específicamente su directorio personal descarga, que por defecto a false flag ->

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 sólo uno Environment.ExpandEnvironmentVariables línea () -> (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
}

Otros consejos

Sí, es especial, descubriendo el nombre de esta carpeta no llegó a ser posible hasta Vista. .NET todavía tiene que apoyar los sistemas operativos anteriores. Puede PInvoke SHGetKnownFolderPath () para anular 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);

Prueba esto:

string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)+ @"\Downloads";

He utilizado el siguiente código y funciona para .NET 4.6 con Windows 7 y superior. El siguiente código da la ruta de la carpeta de perfil de usuario -> "C:\Users\<username>"

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

Siguiente para acceder a las descargas carpeta simplemente se combinan cadenas de ruta adicionales de la siguiente manera:

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

Ahora, el resultado final será

"C:\Users\<username>\Downloads\"

Esperamos que ahorra tiempo a alguien en el futuro.

Proveedores:

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

es sólo un truco, no la solución.

En VB, tratar ...

Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top