当前位置: 首页 > 面试题库 >

在C#中获取下载文件夹?

韶景曜
2023-03-14
问题内容

我编写了一些代码,这些代码将搜索目录并在列表框中显示文件。

DirectoryInfo dinfo2 = new DirectoryInfo(@"C:\Users\Hunter\Downloads");
FileInfo[] Files2 = dinfo2.GetFiles("*.sto");
foreach (FileInfo file2 in Files2)
{
     listBox1.Items.Add(file2.Name);
}

我什至尝试过:

string path = Environment.SpecialFolder.UserProfile + @"\Downloads";
DirectoryInfo dinfo2 = new DirectoryInfo(Environment.SpecialFolder.UserProfile + path);
FileInfo[] Files2 = dinfo2.GetFiles("*.sto");
foreach (FileInfo file2 in Files2)
{
     listBox1.Items.Add(file2.Name);
}

我虽然出错了…

好的,它说的Users\Hunter很好,当人们获得我的软件时,名字就没有猎人了。那么,我该如何将其命名为任何用户的下载文件夹?


问题答案:

WinAPI方法SHGetKnownFolderPath是检索特殊文件夹(包括个人文件夹和下载文件夹)路径的唯一正确方法。

还有其他方法可以获得相似的结果,这些结果看起来很有希望,但最终只能在特定系统上出现完全错误的路径(例如,对路径的一部分进行合并或硬编码或滥用旧的注册表项)。其背后的原因在我的CodeProject文章中进行了说明,该文章还列出了完整的解决方案。它提供了一个包装类,以支持检索所有已知的94个特殊文件夹以及其他一些好东西。

作为此处的一个简单示例,我只是粘贴了该解决方案的简化版本,使其只能检索个人专用文件夹,例如下载:

using System;
using System.Runtime.InteropServices;

/// <summary>
/// Class containing methods to retrieve specific file system paths.
/// </summary>
public static class KnownFolders
{
    private static string[] _knownFolderGuids = new string[]
    {
        "{56784854-C6CB-462B-8169-88E350ACB882}", // Contacts
        "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}", // Desktop
        "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}", // Documents
        "{374DE290-123F-4565-9164-39C4925E467B}", // Downloads
        "{1777F761-68AD-4D8A-87BD-30B759FA33DD}", // Favorites
        "{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}", // Links
        "{4BD8D571-6D19-48D3-BE97-422220080E43}", // Music
        "{33E28130-4E1E-4676-835A-98395C3BC3BB}", // Pictures
        "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}", // SavedGames
        "{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}", // SavedSearches
        "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}", // Videos
    };

    /// <summary>
    /// Gets the current path to the specified known folder as currently configured. This does
    /// not require the folder to be existent.
    /// </summary>
    /// <param name="knownFolder">The known folder which current path will be returned.</param>
    /// <returns>The default path of the known folder.</returns>
    /// <exception cref="System.Runtime.InteropServices.ExternalException">Thrown if the path
    ///     could not be retrieved.</exception>
    public static string GetPath(KnownFolder knownFolder)
    {
        return GetPath(knownFolder, false);
    }

    /// <summary>
    /// Gets the current path to the specified known folder as currently configured. This does
    /// not require the folder to be existent.
    /// </summary>
    /// <param name="knownFolder">The known folder which current path will be returned.</param>
    /// <param name="defaultUser">Specifies if the paths of the default user (user profile
    ///     template) will be used. This requires administrative rights.</param>
    /// <returns>The default path of the known folder.</returns>
    /// <exception cref="System.Runtime.InteropServices.ExternalException">Thrown if the path
    ///     could not be retrieved.</exception>
    public static string GetPath(KnownFolder knownFolder, bool defaultUser)
    {
        return GetPath(knownFolder, KnownFolderFlags.DontVerify, defaultUser);
    }

    private static string GetPath(KnownFolder knownFolder, KnownFolderFlags flags,
        bool defaultUser)
    {
        int result = SHGetKnownFolderPath(new Guid(_knownFolderGuids[(int)knownFolder]),
            (uint)flags, new IntPtr(defaultUser ? -1 : 0), out IntPtr outPath);
        if (result >= 0)
        {
            string path = Marshal.PtrToStringUni(outPath);
            Marshal.FreeCoTaskMem(outPath);
            return path;
        }
        else
        {
            throw new ExternalException("Unable to retrieve the known folder path. It may not "
                + "be available on this system.", result);
        }
    }

    [DllImport("Shell32.dll")]
    private static extern int SHGetKnownFolderPath(
        [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken,
        out IntPtr ppszPath);

    [Flags]
    private enum KnownFolderFlags : uint
    {
        SimpleIDList              = 0x00000100,
        NotParentRelative         = 0x00000200,
        DefaultPath               = 0x00000400,
        Init                      = 0x00000800,
        NoAlias                   = 0x00001000,
        DontUnexpand              = 0x00002000,
        DontVerify                = 0x00004000,
        Create                    = 0x00008000,
        NoAppcontainerRedirection = 0x00010000,
        AliasOnly                 = 0x80000000
    }
}

/// <summary>
/// Standard folders registered with the system. These folders are installed with Windows Vista
/// and later operating systems, and a computer will have only folders appropriate to it
/// installed.
/// </summary>
public enum KnownFolder
{
    Contacts,
    Desktop,
    Documents,
    Downloads,
    Favorites,
    Links,
    Music,
    Pictures,
    SavedGames,
    SavedSearches,
    Videos
}

(在上面链接的CodeProject文章中找到了完整注释的版本。)

尽管这只是一堆令人讨厌的代码,但您必须处理的表面非常简单。这是一个控制台程序示例,它输出Downloads文件夹的路径。

private static void Main()
{
    string downloadsPath = KnownFolders.GetPath(KnownFolder.Downloads);
    Console.WriteLine("Downloads folder path: " + downloadsPath);
    Console.ReadLine();
}

例如,只需KnownFolders.GetPath()使用KnownFolder文件夹的枚举值调用要查询的路径即可。

NuGet软件包

如果您不想经历所有麻烦,只需安装我最近创建的NuGet软件包。这是项目站点,这是图库链接(请注意用法不同且经过修饰,请查阅项目站点上的“用法”部分以获取更多信息)。

PM> Install-Package Syroot.Windows.IO.KnownFolders

用法:

using System;
using Syroot.Windows.IO;

class Program
{
    static void Main(string[] args)
    {
        string downloadsPath = new KnownFolder(KnownFolderType.Downloads).Path;
        Console.WriteLine("Downloads folder path: " + downloadsPath);
        Console.ReadLine();
    }
}


 类似资料:
  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接

  • X2.2.0新增 sp_get_file_download_url($file,$expires=3600) 功能: 获取文件下载链接 参数: $file: 数据库保存的文件路径 $expires:文件过期时间(七牛) 返回: 类型string,文件下载链接 使用: $url = sp_get_file_download_url('portal/23232.png');

  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接

  • 问题内容: 我正在从Web服务器下载整个目录。它可以正常工作,但是我无法弄清楚如何在下载之前获取文件大小以进行比较(如果服务器上是否已更新)。可以像从FTP服务器下载文件一样完成此操作吗? @Jon:感谢您的快速回答。它可以工作,但是Web服务器上的文件大小略小于下载文件的文件大小。 例子: 与CR / LF转换有关系吗? 问题答案: 我转载了您所看到的: 输出此: 我在这里做错了什么?os.st

  • 问题内容: 基本上,我想确定是否应该使用AJAX下载文件,具体取决于文件大小。 我猜这个问题也可以表述为:我如何仅获取ajax请求的标头? 编辑 :评论中的ultima-rat0告诉了我两个已经被问到的显然与这个相同的问题。它们非常相似,但是都需要jQuery。我想要一个非jQuery解决方案。 问题答案: 您可以手动获取XHR响应头数据: http://www.w3.org/TR/XMLHttp

  • 我在两个不同的服务器上使用这个脚本: 这些服务器具有相同的PHP版本和相同的PHP Curl版本。以下是curl结果的两个不同标题: 工作一: HTTP/1.1 302查找日期:2012年6月12日星期二07:04:35 GMT服务器:Apache/2.2.16(Debian)X-Powered-By:PHP/5.3.3-7 squeeze13过期时间:1981年11月19日星期四08:52:00