Подтвердить что ты не робот

Как программно выводить папку загрузки Windows "% USERPROFILE%/Downloads"?

В .Net мы можем восстановить пути к "специальным папкам", таким как Documents/Desktop и т.д. Сегодня я попытался найти способ получить путь к папке "Загрузки", но это не так уж и сложно.

Я знаю, что могу просто "C:\Users\Username\Downloads", но это кажется уродливым решением. Итак, как я могу получить путь, используя .Net?

4b9b3361

Ответ 1

Проблема вашего первого ответа заключается в том, что это даст вам НЕПРАВИЛЬНЫЙ результат, если значение Dir по умолчанию было изменено на [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);
        }
    }

}   

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

Или только одна строка Environment.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
}

Ответ 2

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

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

Ответ 3

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

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

Рядом с доступом к папке загрузки просто добавьте дополнительные строки пути, как показано ниже:

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

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

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

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

Ответ 4

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

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

Ответ 5

пытаться:

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

это всего лишь трюк, а не решение.

Ответ 6

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

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