Как программно выводить Windows Загрузки папки «% UserProfile% / Downloads»?

StackOverflow https://stackoverflow.com/questions/3795023

Вопрос

В .NET мы можем решить пути к «специальным папкам», например, документы / Desktop и т. Д. Сегодня я пытался найти способ получить путь к папке «Загрузки», но это недостаточно специально.

Я знаю, что я могу просто сделать C: Users username downloads ', но это кажется уродливым решением. Так как я могу решить путь, используя .NET?

Это было полезно?

Решение

Проблема вашего первого ответа - это даст вам неправильный результат, если загрузок по умолчанию был изменен на [Download1]! Надлежащий способ сделать это, охватывающие все возможности

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

}   

Чтобы проверить его, если вы специально хотите, чтобы ваша личная загрузка DIR, вы флагите по умолчанию для 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
}

Или только одна строчная среда. ExpandenvironmentVariables () -> (самое простое решение).

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
}

Другие советы

Да, это особенное, открывая имя этой папки не стало возможным до Vista. .NET все еще необходимо поддерживать предварительные операционные системы. Вы можете Pinvoke ShgetknownolderPath (), чтобы обойти это ограничение, как это:

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

Попробуй это:

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

Я использовал код ниже, и он работает для .NET 4.6 с Windows 7 и выше. Код ниже дает путь папки профиля пользователя -> "C:\Users\<username>"

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

Далее для доступа к папке загрузок просто сочетайте дополнительные строки пути, как показано ниже:

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

Теперь окончательный результат будет

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

Надеюсь, это экономит время для кого-то в будущем.

пытаться:

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

Это просто трюк, а не решение.

Для VB, попробуйте ...

Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top