我制作了一些代码,用于搜索目录并在列表框中显示文件。
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
好吧,当人们拿到我的软件时,名字不是猎人......所以如何将它转到任何用户下载文件夹的位置?
答案 0 :(得分:81)
WinAPI方法SHGetKnownFolderPath
是检索特殊文件夹路径的唯一正确方法 - 包括个人文件夹和下载文件夹。
还有其他方法可以获得看似有希望的类似结果,但最终只能在特定系统上使用完全错误的路径(例如,组合或硬编码路径的某些部分或滥用旧的注册表项)。其背后的原因在my CodeProject article中说明,其中也列出了完整的解决方案。它提供了一个包装类,支持检索所有已知的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套餐
如果你不想完成所有这些hazzle,只需安装我最近创建的NuGet包。这是project site,这里是gallery link(请注意,使用情况有所不同,请参阅项目网站上的“使用”部分以获取更多信息)。
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();
}
}
答案 1 :(得分:5)
最简单的方法是:
Process.Start("shell:Downloads");
如果您只需要获取当前用户的下载文件夹路径,则可以使用:
我从@PacMani的代码中提取了它。
// using Microsoft.Win32;
string GetDownloadFolderPath()
{
return Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "{374DE290-123F-4565-9164-39C4925E467B}", String.Empty).ToString();
}
答案 2 :(得分:0)
答案 3 :(得分:0)
跨平台版本:
public static string getHomePath()
{
// Not in .NET 2.0
// System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
return System.Environment.GetEnvironmentVariable("HOME");
return System.Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");
}
public static string getDownloadFolderPath()
{
if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
{
string pathDownload = System.IO.Path.Combine(getHomePath(), "Downloads");
return pathDownload;
}
return System.Convert.ToString(
Microsoft.Win32.Registry.GetValue(
@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
,"{374DE290-123F-4565-9164-39C4925E467B}"
,String.Empty
)
);
}
答案 4 :(得分:-1)
通常,您的软件应具有一个可配置变量,用于存储用户的下载文件夹(可由用户分配),并在未设置时提供默认值。您可以将值存储在app config文件或注册表中。
然后在您的代码中读取存储位置的值。
答案 5 :(得分:-1)
string download = Environment.GetEnvironmentVariable("USERPROFILE")+@"\"+"Downloads";