在我的机器上,它就在这里:
string downloadsPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
"Downloads");
但在同事机器上,此文件夹不存在,他的“下载”文件夹位于“我的文档”文件夹中。 我们都在Windows 7上 *。
* 编辑:事实上,事实证明他没有在自己的计算机上运行应用程序,而是使用Windows Server 2003计算机。
答案 0 :(得分:22)
Windows没有为“下载”文件夹定义CSIDL,并且无法通过Environment.SpecialFolder
枚举进行定位。
但是,新的Vista Known Folder API会使用FOLDERID_Downloads
的ID对其进行定义。获取实际值的最简单方法可能是P / invoke SHGetKnownFolderPath
。
public static class KnownFolder
{
public static readonly Guid Downloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
}
[DllImport("shell32.dll", CharSet=CharSet.Unicode)]
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out string pszPath);
static void Main(string[] args)
{
string downloads;
SHGetKnownFolderPath(KnownFolder.Downloads, 0, IntPtr.Zero, out downloads);
Console.WriteLine(downloads);
}
请注意,pinvoke.net上给出的P / invoke不正确,因为它无法使用Unicode字符集。此外,我还利用了这个API返回COM分配器分配的内存这一事实。上面P / invoke的默认编组是使用CoTaskMemFree
释放返回的内存,这对我们的需求是完美的。
请注意,这是一个Vista及以上的API,不要试图在XP / 2003或更低版本上调用它。
答案 1 :(得分:11)
您可以使用Windows API Code Pack for Microsoft .NET Framework。
参考: Microsoft.WindowsAPICodePack.Shell.dll
需要以下命名空间:
using Microsoft.WindowsAPICodePack.Shell;
简单用法:
string downloadsPath = KnownFolders.Downloads.Path;
答案 2 :(得分:0)
以下是我使用的VB.Net函数
<DllImport("shell32.dll")>
Private Function SHGetKnownFolderPath _
(<MarshalAs(UnmanagedType.LPStruct)> ByVal rfid As Guid _
, ByVal dwFlags As UInt32 _
, ByVal hToken As IntPtr _
, ByRef pszPath As IntPtr
) As Int32
End Function
Public Function GetDownloadsFolder() As String
Dim Result As String = ""
Dim ppszPath As IntPtr
Dim gGuid As Guid = New Guid("{374DE290-123F-4565-9164-39C4925E467B}")
If SHGetKnownFolderPath(gGuid, 0, 0, ppszPath) = 0 Then
Result = Marshal.PtrToStringUni(ppszPath)
Marshal.FreeCoTaskMem(ppszPath)
End If
Return Result
End Function
在我的程序中,我调用它将一些CSV文件移动到另一个文件夹中。
Dim sDownloadFolder = GetDownloadsFolder()
Dim di = New DirectoryInfo(sDownloadFolder)
'Move all CSV files that begin with BE in specific folder
'that has been defined in a CONFIG file (variable: sExtractPath
For Each fi As FileInfo In di.GetFiles("BE*.csv")
Dim sFilename = sExtractPath & "\" & fi.Name
File.Move(fi.FullName, sFilename)
Next