给出一个文件夹,我怎么能告诉大家,这是一个回收站?我发现一个 答案 C++但不适用于C#。

我第一个想法是检查FileAttributes.系统(这将是一个可以接受近似于我的情况),但实际上,这标志清关于回收文件夹。

原方案使用的硬编码文件夹,名称是出的问题(我们在2009年之后的所有)。

有帮助吗?

解决方案

有一个小问题就在这里。Windows回收站是一个虚拟的文件夹和实际上并不存在。文件你看到的不是实际上在该文件夹中,他们都表示现有的磁盘上的文件已经重新命名为一个特别的名字,其中"中删除"它们的可见文件系统,但不是物理的一个。

你可能"证明"这个为自己要求的文件夹中的位置,使用该win32API。它将回报 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 above
// 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
}

假文件夹名称 "$回收。站" 重复的每一个驱动器。隐藏的名字是不是储存在登记册,这是不能通过API如此。早先的建议KnownFolderHelper会不是检索这一信息(同lib有一个命名方法对于获得的回收站,它也有一个 GetPath, 它将打开了空)。

但一切都不会丢失。这个假不存在"的文件名称"或"文件夹,名称为"含有一个隐藏的文件,看起来喜欢的东西 "S-1-5-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文档不是很清楚的,但是如果你需要确认, 这页解释 这真的是没有路可以检索(的 老年CSIDL相关网页 是更清楚)。

更新: 替代的办法 SHGetSpecialFolderPath, SHGetSpecialFolderLocation, ShellAPI.SHGetFolderLocationSHGetPathFromIDList 所有失败,有相同的:任何一个空的结果或者一个错误。我测试了所有功能都用于回收站和为应用程序数据(可以肯定的是我的使用正确的参数)。

只有上的文档 ShGetPathFromIDListEx 说它明确地说: "除了UNC打印机的名字,如果指定的位置pidl参数没有文件系统的一部分,这种功能失败。".

其他提示

微软的的Windows API代码包包含此功能。

要得到回收站的文件夹,使用

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

我不知道什么该字符串的手段,但它被包含在文档作为参考回收站。

希望这有助于:)

大多数回收站相关的方法已经写在C ++中,你提到的。你可以使用托管扩展在应用程序中创建一个包装类到C ++ ,那么你将不得不使用的DllImport这样的:

using System;
using System.Runtime.InteropServices;

class MainApp
{
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MessageBox(int hWnd, String strMessage, String
strCaption, uint uiType);

public static void Main()
{
MessageBox( 0, "Hello, this is PInvoke in operation!", ".NET", 0 );
}
}

也有在那里,做一些其他的方式与C#的文章,大部分都使用的PInvoke或依赖它的名字有$回收站的文件夹。以下是我已经找到了这个问题的几个环节

HTTP://社会.msdn.microsoft.com /论坛/ EN / csharpgeneral /线程/ 05f1476f-a101-4766-847b-0bdf4f6ad397

http://www.codeproject.com/KB/shell/recyclebin.aspx

http://www.pinvoke.net/default.aspx/shell32.SHFileOperation

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top