当前位置: 首页 > 编程语言 > C#

C#中如何判断目录是回收站?分享

时间:2023-04-10 19:18:04 C#

C#如何判断一个目录是不是回收站?给定一个文件夹,我怎么知道它是回收站?我找到了C++的答案,但没有找到C#的答案。我的第一个想法是检查FileAttributes.System(在我的情况下这是一个可接受的近似值),但实际上标志在回收文件夹中被清除。使用硬编码文件夹名称的原始解决方案是不可能的(毕竟我们是在2009年)。这里有点问题。Windows回收站是一个实际上并不存在的虚拟文件夹。您看到的文件实际上并不在该文件夹中,它们是磁盘上已重命名为特殊名称的现有文件的表示,这会将它们从可见文件系统中“删除”,而不是从物理系统中删除。您可以通过使用win32API询问文件夹位置来自己“证明”这一点。它将为回收站返回E_FAIL,但不会返回其他文件夹(请参阅pinvoke.net(和MSDN上的SHGetKnownFolderPath)了解您可以使用的所有常量和运行此代码所需的声明):IntPtrptrRecycleBinPath;//用KnownFolder.QuickLaunch试试看它是否有效:HRESULThr=(HRESULT)SHGetKnownFolderPath(KnownFolder.RecycleBinFolder,0,IntPtr.Zero,outptrRecycleBinPath);if(hr==HRESULT.E_FAIL){Console.WriteLine("没有可用文件夹,虚拟文件??夹");}elseif(hr==HRESULT.S_OK){stringRecycleBinPath=Marshal.PtrToStringUni(ptrRecycleBinPath);Marshal.FreeCoTaskMem(ptrRecycleBinPath);Console.WriteLine("路径:"+RecycleBinPath);}//为方便起见,如果在类中粘贴以下声明,则可以直接使用上面的代码//获取“已知路径”[DllImport("shell32.dll")]staticexternlongSHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)]Guidrfid,uintdwFlags,IntPtrhToken,outIntPtrpszPath);//已知文件夹GUID声明publicstaticclassKnownFolder{//更多条目存在,为清楚起见此处省略publicstaticreadonlyGuidRecycleBinFolder=newGuid("B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC");publicstaticreadonlyGuidQuickLaunch=newGuid("52a4f021-9b75-f78b2");//....}//COM调用的结果:枚举HRESULT:uint{S_FALSE=0x0001,S_OK=0x0000,E_FAIL=0x80004005,E_INVALIDARG=0x80070057,E_OUTOFMEMORY=0x8007000E}对每个驱动器重复使用假名称“Recycle.bin"隐藏名称未存储在注册表中,API无法访问它。之前建议的KnownFolderHelper也不会检索此信息(同一个库有一个命名方法来获取回收站,它还有一个GetPath将变为空)。但一切都没有丢失。这个虚假的不存在的“文件名”或“文件夹名”包含一个隐藏文件,看起来像“S-1-5-21-2703390745-3900912742-210389625-1000”(你的不一样)。这是找出某个文件名是否实际上是回收站的虚拟目录的两种“可靠”方法之一(另一种方法是:通过SHFileOperation删除文件,并检查它是否出现在您拥有的目录中文件夹):string[]entries=Directory.GetFileSystemEntries(@"c:$Recycle.bin","?-?-?-??*");if(entries.Length>0)//我们有一个赢家else//不,不是回收站注意:我不知道其他win32版本上的隐藏文件夹是什么,您需要稍微试验一下。它们都设置了系统和隐藏标志,看起来像是一个受损的GUID。API文档对此不是很清楚,但如果您需要确认,此页面说确实没有检索路径(较旧的CSIDL相关页面不太清楚)。更新:使用SHGetSpecialFolderPath、SHGetSpecialFolderLocation、ShellAPI.SHGetFolderLocation和SHGetPathFromIDList替代方案均失败:结果为空或出现错误。我测试了回收站和AppData的所有功能(确保我使用了正确的参数)。只有ShGetPathFromIDListEx上的文档明确指出,“除了UNC打印机名称之外,如果pidl参数指定的位置不是文件系统的一部分,则此函数将失败。”。正如您所提到的,大多数与回收站相关的方法都是用C++编写的。您可以使用C++的托管扩展在您的应用程序中创建一个包装类,然后您必须像这样使用DLLImport:使用System.Runtime.InteropServices;classMainApp{[DllImport("user32.dll",EntryPoint="MessageBox")]publicstaticexternintMessageBox(inthWnd,StringstrMessage,StringstrCaption,uintuiType);publicstaticvoidMain(){MessageBox(0,"你好,这是运行中的PInvoke!",".NET",0);也有一些文章在C#中以其他方式执行此操作,其中大多数使用PInvoke或依赖名称中带有$Recycle的文件夹。以下是我为该主题找到的一些链接http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/05f1476f-a101-4766-847b-0bdf4f6ad397http://www.codeproject.com/KB/shell/recyclebin.aspxhttp://www.pinvoke.net/default.aspx/shell32.SHFileOperationMicrosoft的WindowsAPI代码包包含此功能。要获取回收站的文件夹,请使用Microsoft.WindowsAPICodePack.Shell.KnownFolderHelper.FromPath("::{645FF040-5081-101B-9F08-00AA002F954E}");我不知道该字符串是什么意思,但它可以作为参考文档中包含对回收站的参考。希望对你有所帮助:)以上是C#学习教程:C#中如何判断一个目录是不是回收站?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: