CSharp - 在 C# 中,如何知道目录是回收箱?

  显示原文与译文双语对照的内容
0 0

给定一个文件夹,我如何才能确定它是回收站? 我发现一个为C# C++的但不回答。?

我的第一个想法就是检查FileAttributes .System ( 对于我来说是可以接受近似) 但实际上这个标志被清除回收站文件夹上。

使用硬编码粗糙解决方案文件夹名称都谈不上( 我们在2009年毕竟) 。

时间:原作者:7个回答

0 0

这里有个小问题, 在Windows回收站是一个虚拟文件夹,实际上是不存在的。 可以看到实际上并不是该文件夹中的文件,它们的表示磁盘上现有文件已重命名为一个特殊的名称,该" 删除" 将其从可见的文件系统,但不能物理一个。

可以" 证据" 眼见为实请求文件夹位置来使用win32 API 。 它将返回 E_FAIL对于回收站,但不为其他文件夹( 参见 SHGetKnownFolderPath上pinvoke .NET ( 和MSDN上 ) 可以使用的所有常量和声明ۻ代码运行) :

IntPtr ptrRecycleBinPath;
// try it with KnownFolder.QuickLaunch to see it working:
HRESULT hr = (HRESULT) SHGetKnownFolderPath(
     KnownFolder.RecycleBinFolder, 
     0, 
     IntPtr.Zero, 
     out ptrRecycleBinPath);
if (hr == HRESULT.E_FAIL)
{
    Console.WriteLine("No folder avaialable, virtual folder");
}
else if (hr == HRESULT.S_OK)
{
    string RecycleBinPath = Marshal.PtrToStringUni(ptrRecycleBinPath);
    Marshal.FreeCoTaskMem(ptrRecycleBinPath);
    Console.WriteLine("path: " + RecycleBinPath);
}
// for convenience, you can use the code 上面
// directly if you paste the follow declarations in your class:
// get a "known path"
[DllImport("shell32.dll")]
static extern long SHGetKnownFolderPath(
    [MarshalAs(UnmanagedType.LPStruct)] Guid rfid, 
    uint dwFlags, 
    IntPtr hToken, 
    out IntPtr pszPath);
// known folder GUID declarations
public static class KnownFolder
{
    // many more entries exist, left out for clarity here
    public static readonly Guid RecycleBinFolder = 
         new Guid("B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC");
    public static readonly Guid QuickLaunch = 
         new Guid("52a4f021-7b75-48a9-9f6b-4b87a210bc8f");
    //....
}
// results of COM invocations:
enum HRESULT : uint
{
    S_FALSE = 0x0001,
    S_OK = 0x0000,
    E_FAIL = 0x80004005,
    E_INVALIDARG = 0x80070057,
    E_OUTOFMEMORY = 0x8007000E
}

假冒foldername " $Recycle bin " 重复于每个驱动器。 隐藏的名称并没有存储在注册表中也无法访问的API因此。 早期建议KnownFolderHelper不会检索这些信息( 或者相等lib有一个命名方法用于获取回收站,它也具有 GetPath,它会出现空) 。

但没消失。 那个假非现有" 文件名" 或" 文件夹名称" 包含隐藏文件类似下面 " s 15 21 2703390745 3900912742 210389625 1000 " ( 你的输出结果可能会不同) 。 这是两种" 可靠" 的方法想知道是否有某些文件名实际上是一个虚拟目录的回收站( 的另一种方法是: 删除文件通过SHFileOperation这里解释,并检查它是否出现在文件夹请填写) :

string [] entries = Directory.GetFileSystemEntries(@"c:$Recycle.bin", "?-?-?-??*");
if(entries.Length > 0)
   // we have a winner
else 
   // no, not the recycle bin

注: 我不知道隐藏的文件夹位于其他win32版本,你我得实验有点。 他们都有设置系统和隐藏标志,打扮看上去像个损坏GUID 。

API docs不完全弄清楚这件事,但如果你需要确认,此页说明,我们确实没有路径可以检索( 旧CSIDL相关页远远没有清除的文件夹) 。

Update :备用方案SHGetSpecialFolderPathSHGetSpecialFolderLocationShellAPI.SHGetFolderLocationSHGetPathFromIDList所有失败,并出现相同的: 空结果或错误。 我测试了所有函数都为回收站和AppData ( 以确保我使用正确的参数) 。

只有有关文档ShGetPathFromIDListEx说明确时曾说: " 除了UNC打印机名称,如果指定的位置pidl参数不是文件系统的一部分,此函数失败" 。

原作者:
0 0

microsoft的 Windows API Code Pack 包含此功能。

以获取的文件夹回收站,请使用

Microsoft.WindowsAPICodePack.Shell.KnownFolderHelper.FromPath("::{645FF040-5081-101B-9F08-00AA002F954E}");

我不知道该字符串表示,但它被包含在文档中作为参考到回收站。

希望借此= = = = =

原作者:
...