如何确定Windows“下载文件夹”路径?

时间:2011-10-06 10:00:51

标签: c# windows

在我的机器上,它就在这里:

string downloadsPath = Path.Combine(
   Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
   "Downloads");

但在同事机器上,此文件夹不存在,他的“下载”文件夹位于“我的文档”文件夹中。 我们都在Windows 7上 *。

* 编辑:事实上,事实证明他没有在自己的计算机上运行应用程序,而是使用Windows Server 2003计算机。

3 个答案:

答案 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