在本地 NTFS 驱动器上查找回收站

2023-11-30

我正在尝试编写一些简单的代码,该代码将返回本地驱动器上回收站的目录。看起来很简单——谷歌上应该有一千个答案。还没找到:(

我发现 FAT 和 NTFS 驱动器具有不同的基本名称(RECYCLED 和 RECYCLER)。我发现“回收站”是一个虚拟文件夹,结合了计算机上所有驱动器的回收站。

我还没有找到找到 C: 驱动器回收站目录的方法——即使在越南语(或任何其他非英语)机器上也是如此。 (我找不到任何帖子表明“RECYCLER”是否国际化)

有人能给我一个明确的答案吗?

Thanks

更新:意识到CSIDL_BITBUCKET以及使用它的函数。从我读过的所有内容来看,它表明virtual目录是该用户在所有驱动器上删除的所有文件的并集。寻找物理回收站目录(据我所知,在我的 Vista 上,它似乎是 C:\$Recycle.Bin)


使用 Raymond Chen 的建议和其他人的技术(不记得在哪里找到它),我提出了一个函数,可以找到驱动器上的回收站目录。该函数循环遍历根目录中的目录,查看隐藏目录和/或系统目录。当它找到一个时,它会检查子目录以查找具有 CLSID_Recycle Bin 的目录。

请注意,我在下面添加了两个 GetFolderCLSID 函数。 Raymond Chen 的实现较为简单,但它不适用于 Windows 2000。另一种实现较长,但似乎在任何地方都适用。

调用如下: CString recycleDir = FindRecycleBinOnDrive(L"C:\");

CString FindRecycleBinOnDrive(LPCWSTR path)
{
    CString search;
    search.Format(L"%c:\\*", path[0]);
    WIN32_FIND_DATA fd = {0};
    HANDLE fHandle = FindFirstFile(search, &fd);
    while(INVALID_HANDLE_VALUE != fHandle)
    {
        if(FILE_ATTRIBUTE_DIRECTORY == (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //only check directories
        {
            if(0 != (fd.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))) //only check hidden and/or system directories
            {
                //the recycle bin directory itself won't be marked, but a SID-specific child directory will, so now look at them
                CString childSearch;
                childSearch.Format(L"%c:\\%s\\*", path[0], fd.cFileName);
                WIN32_FIND_DATA childFD = {0};
                HANDLE childHandle = FindFirstFile(childSearch, &childFD);
                while(INVALID_HANDLE_VALUE != childHandle)
                {
                    if((FILE_ATTRIBUTE_DIRECTORY == (childFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) && //only check directories
                        (childFD.cFileName[0] != L'.')) //don't check . and .. dirs
                    {
                        CString fullPath;
                        fullPath.Format(L"%c:\\%s\\%s", path[0], fd.cFileName, childFD.cFileName);
                        CLSID id = {0};
                        HRESULT hr = GetFolderCLSID(fullPath, id);
                        if(SUCCEEDED(hr))
                        {
                            if(IsEqualGUID(CLSID_RecycleBin, id))
                            {
                                FindClose(childHandle);
                                FindClose(fHandle);
                                //return the parent (recycle bin) directory
                                fullPath.Format(L"%c:\\%s", path[0], fd.cFileName);
                                return fullPath;
                            }
                        }
                        else
                        {
                            Log(logERROR, L"GetFolderCLSID returned %08X for %s", hr, fullPath);
                        }
                    }

                    if(FALSE == FindNextFile(childHandle, &childFD))
                    {
                        FindClose(childHandle);
                        childHandle = INVALID_HANDLE_VALUE;
                    }
                }
            }
        }
        if(FALSE == FindNextFile(fHandle, &fd))
        {
            FindClose(fHandle);
            fHandle = INVALID_HANDLE_VALUE;
        }
    }
    _ASSERT(0);
    return L"";
}


//Works on Windows 2000, and even as Local System account
HRESULT GetFolderCLSID(LPCWSTR path, CLSID& pathCLSID)
{
    LPMALLOC pMalloc = NULL;
    HRESULT hr = 0;
    if (SUCCEEDED(hr = SHGetMalloc(&pMalloc))) 
    {
        LPSHELLFOLDER pshfDesktop = NULL;
        if (SUCCEEDED(hr = SHGetDesktopFolder(&pshfDesktop))) 
        {
            LPITEMIDLIST pidl = NULL;
            DWORD dwAttributes = SFGAO_FOLDER;
            if (SUCCEEDED(hr = pshfDesktop->ParseDisplayName(NULL, NULL, (LPWSTR)path, NULL, &pidl, &dwAttributes))) 
            {
                LPPERSIST pPersist = NULL;
                if (SUCCEEDED(hr = pshfDesktop->BindToObject(pidl, NULL, IID_IPersist, (LPVOID *) &pPersist))) 
                {
                    hr = pPersist->GetClassID(&pathCLSID); 
                    pPersist->Release();
                } 
                pMalloc->Free(pidl);
            } 
            pshfDesktop->Release();
        } 
        pMalloc->Release();
    }
    return hr;
}


//Not supported on Windows 2000 since SHParseDisplayName wasn't implemented then
//HRESULT GetFolderCLSID(LPCWSTR pszPath, CLSID& pathCLSID)
//{
//  SHDESCRIPTIONID did = {0};
//  HRESULT hr = 0;
//  LPITEMIDLIST pidl = NULL;
//  if (SUCCEEDED(hr = SHParseDisplayName(pszPath, NULL, &pidl, 0, NULL))) //not supported by Windows 2000
//  {
//      IShellFolder *psf = NULL;
//      LPCITEMIDLIST pidlChild = NULL;
//      if (SUCCEEDED(hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&psf, &pidlChild))) 
//      {
//          hr = SHGetDataFromIDList(psf, pidlChild, SHGDFIL_DESCRIPTIONID, &did, sizeof(did));
//          psf->Release();
//          pathCLSID = did.clsid;
//      }
//      CoTaskMemFree(pidl);
//  }
//  return hr;
//}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在本地 NTFS 驱动器上查找回收站 的相关文章

  • 从注册表中检索 Windows 密码提示

    我一直在尝试以编程方式提取 Windows 7 的 Windows 登录密码提示 我发现可以从注册表中的以下位置检索它HKLM SAM SAM Domains Account Users 用户密钥 UserPasswordHint但是 我不
  • 自定义 Windows 7 登录 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何为 Windows 7 登录屏幕进行编程 不仅仅是替换背景图像 就像我希望它通过 RFID 阅读器进行身份验证一样 我能做到吗 我知道 XP 可
  • 如何获取Windows 7中的“临时文件夹”?

    在 Windows 7 中 如何以编程方式获取系统临时文件夹 The 获取临时路径 http msdn microsoft com en us library windows desktop aa364992 28v vs 85 29 as
  • 如何在 Windows 中拦截 DNS 查询

    我正在研究如何在 Windows 中拦截 DNS 查询 以一种不需要将 DLL 注入到每个进程中的方式 并且理想情况下能够根据发出查询的进程做出决策 因此简单的 DNS 代理服务器是不够的 从表面上看 DNS 查询所采用的路径如下所示 某些
  • 如何用Java实现Kerberos协议转换? (S4U2自我)

    Edit 现在我知道我需要什么了 我需要在Java中实现Kerberos协议转换 S4U2Self Net 中有示例 但没有 Java 的示例 有这个第三方库Java 版 Quest 单点登录 http www quest com sing
  • 如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

    我有一个 Windows C 控制台程序 如果我不调用ReleaseDriver 在我的程序结束时 某些硬件会进入错误状态 并且在不重新启动的情况下无法再次使用 我想确定一下ReleaseDriver 即使程序异常退出 例如如果我点击Ctr
  • Windows 7 跳转列表(Windows 窗体、C#)

    有谁知道如何在 C 中自定义与我自己的应用程序相关的 Windows 跳转列表功能 我知道可以做到 但我在 MSDN 上找不到任何与 C Windows7 相关的内容 到目前为止 我能找到的与 W7 和 C 相关的唯一信息只是我已经阅读过的
  • “sed” 在文件中插入反斜杠

    Tool Windows 版 Git Bash Problem 尝试在目录中每个文件的顶部插入文本 connectcentral Code for f in DIR sql do sed i 1i connect central f don
  • 如何引用所有正在运行的 Excel 应用程序实例(包括隐藏的和没有工作簿的实例)的 COM 对象?

    如何获取每个正在运行的 Excel 应用程序实例的完整引用列表 无论其工作簿数量和可见性状态如何 我知道我可以使用 Windows API 来查找每个 Excel 工作簿窗口 其窗口类名称EXCEL7 让他们的句柄与AccessibleOb
  • Windows批处理文件-显示所有子文件夹

    我在使用 Windows 批处理文件返回 JUST 文件夹 忽略文件 时遇到困难 这就是我现在所拥有的 目前它正在返回文件和子子文件夹 for r g in xx do echo g 另外 假设我只想返回以几个不同前缀开头的文件夹 例如 我
  • 运行时更改进程名称 (C++)

    是否可以在 win32 中运行时更改进程的名称 任务管理器中 进程 下出现的名称 我希望该程序能够更改自己的名称 而不是其他程序的名称 帮助将不胜感激 最好是 C 为了消除任何关于病毒的想法 不 这不是病毒 是的 我知道我在做什么 这是为了
  • 在 Windows 任务栏中对单独的进程进行分组

    我有许多逻辑上相关的独立进程 但所有进程都是单独启动的 没有共同的 父 进程 是否可以使它们在 Windows 任务栏中显示为一组 工作样本 这是一些受雷米答案启发的工作代码 using System using System Runtim
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 终止进程树(C for Windows)

    以前曾有人问过这个问题 但我在代码中找不到明确的答案 我打开一个进程 ProcessA PID 为 1234 此进程打开一个子进程 ProcessAB PID 5678 完成后 我终止了 ProcessA 但 ProcessAB 仍然存在
  • 没有名为“_pywrap_tensorflow_internal”的模块

    在尝试验证tensorflow gpu的安装时 在尝试执行 import tensorflow as tf 时出现ImportError 我在 Windows 7 上使用 Quadro K620 Tensorflow 是使用 pip 安装的
  • 如何在 Windows 8 上注册自定义 Win+V 热键?

    可以在 Windows 8 之前的 Windows 版本上注册 Win V 热键 使用此组合的示例应用程序是PureText http www stevemiller net puretext 在 Windows 8 Release Pre
  • 强制节点在 Windows 上使用 git bash

    我有一个 package json 文件 如下所示 name APP version 3 0 0 private true scripts start node app js test test dbLoad env db test tes
  • Python ctypes:SetWindowsHookEx 回调函数从未被调用

    我正在尝试用 Python 编写一个程序 该程序可以识别何时显示警报框 对话框 它正在处理多个监视器 我希望它在任务栏图标闪烁 弹出错误 通知等时在辅助监视器上显示可视化效果 据我所知 检测这些事件的方法是使用消息挂钩 如下所述 http
  • 无法在 Windows 的多处理环境中“pickle”Tkinter 对象

    我正在尝试创建一个应用程序 其中 Tkinter GUI 由不断获取数据的其他对象更新 我在使用多线程时遇到问题 因此我决定尝试使用多处理模块 我发现您无法在其中运行 Tkinter 窗口multiprocessing Process 这是
  • Python执行windows cmd函数

    我知道你可以使用 subprocess 通过 Python 脚本运行 Linux 终端命令 subprocess call ls l for linux 但我找不到在 Windows 上做同样事情的方法 subprocess call di

随机推荐

  • Haskell 函数的参数数量

    当我尝试用以下命令编译它时ghc它抱怨函数定义左侧的参数数量不同 module Example where import Data Maybe from maybe a gt Maybe a gt a from maybe a Nothin
  • Python:Plt 条形图 - 不同颜色

    在Python中 我怎样才能使 reported 绿色条形 以及 UNREPORTED 酒吧红色 我想为图表中每个已报告和未报告的条形赋予不同的颜色 new AXIN 37 reported LGR 30 UNREPORTED NKD 24
  • YouTube iframe 事件

    我尝试捕获 YouTube iframe 的事件 http lab joergpfeiffer de videofull youtube php 所以我首先调用api 我设置了 iframe
  • 具有重复的递归排列

    我正在尝试编写一个递归函数 该函数通过给定列表的重复来获取所有排列 Eg set ABC 1 AAA 2 AAB 3 AAC 4 ABA N CCC 我想要此代码的递归版本 以便我可以获得任何大小的集合的排列 for i 0 i
  • 0..9 约束在 GCC 内联汇编中起什么作用?

    手册 says 允许使用与指定操作数编号匹配的操作数 如果一个数字 在同一个选项中与字母一起使用 数字应该放在最后 我不确定这意味着什么 示例代码 asm volatile swap 0 r value 0 value 堆栈溢出的内联汇编标
  • Chrome 扩展程序仅在单击某些网页时起作用

    我正在尝试让我的 Chrome 扩展程序在用户打开时弹出警报http google com 并单击扩展图标 我有以下清单 manifest version 2 name One Megahurt version 0 1 permission
  • 我想制作一个像 WhatsApp 个人资料照片对话框屏幕一样的对话框屏幕

    大家好 我目前正在尝试使用隐式意图创建一个对话框 我想在其中显示我的对话框 例如 WhatsApp 个人资料照片屏幕 并且在此屏幕中 WhatsApp 使用名为 删除照片 的额外字段 当我尝试制作相同类型的屏幕对话框时 我无法添加此额外字段
  • 如何更改 vue-cli 的分隔符?

    我安装了 vue cli webpack simple src main js import Vue from vue import App from App vue new Vue delimiters here delimiters s
  • 为 Javascript 制作文件

    有人可以告诉我如何使用 make 文件来组合和合并不同的 javascript 文件 我见过许多不同的项目使用不同的 javascript 文件 后来使用 MAKE 实用程序进行合并 Deep None
  • Java Swing —— 编写一个可根据自定义数据对象的更改重新绘制自身的 Ui

    首先 我已经发布了一个问题earlier其中我曾就为什么我的代码无法工作而寻求帮助 并且这个问题是根据我在该问题中得到的建议采取的 我的用例是这样的 我正在写一个MethodEditor模块其中每个Method由具有 2 个数据成员的自定义
  • spring在使用aop类级别注释时为错误的类创建代理

    当使用 spring AOP 和类级别注释时 springcontext getBean似乎总是为每个类创建并返回一个代理或拦截器 无论它们是否有注释 此行为仅适用于类级别注释 对于方法级别的注解 或者执行切入点 如果不需要拦截 getBe
  • 使用python的pillow库:如何在不创建图像的绘制对象的情况下绘制文本

    下面的代码展示了如何通过创建绘图对象在图像上写入文本 from PIL import Image ImageFont ImageDraw image Image new mode RGBA size 500 508 draw ImageDr
  • 有没有办法阻止 VB6 编译器打乱文件内容?

    由于未知的原因 VB6 编译器通常喜欢重新排序 vbp 文件的内容和 frm 文件顶部的控件描述符块 描述表单上控件属性的代码 您在IDE 但您确实可以在文本编辑器中看到在版本控制中与先前版本进行比较时 在比较文件的修订版本时 这非常烦人并
  • 有没有一种算法可以告诉两个短语的语义相似度

    输入 短语 1 短语 2 输出 语义相似度值 0到1之间 或者这两个短语谈论同一件事的概率 您可能想查看这篇论文 基于语义网络和语料库统计的句子相似度 PDF 我已经实现了所描述的算法 我们的背景非常笼统 实际上是任何两个英语句子 我们发现
  • 如何在 SWI-Prolog 中扩展结果列表?

    length L 25 L G245 G248 G251 G254 G257 G260 G263 G266 G 269 如果我在长度谓词后使用 write L 那么解释器会打印列表两次 一次扩展 另一次不扩展 深度有限制 防止输出过长 您可
  • 使用 Ruby 对字符串中的字符进行转义

    给定以下格式的字符串 Posterous API 以这种格式返回帖子 s u003Cp u003E 我怎样才能将它转换为实际的ascii字符 这样s p 在 OSX 上 我成功地使用了Iconv iconv ascii java s 但一旦
  • 使用 Spring AOP 触发了哪个接口(扩展 CrudRepository)的删除方法?

    Repository public interface UserRepository extends JpaRepository
  • Visual Studio 不再打开 Winforms 的图形编辑器

    我正在构建非常小的 15 分钟应用程序 它可以帮助我和我的同事完成简单的日常业务工作 为此 我经常使用 WinForm 因为它非常快 只需制作一个带有 2 个文本框和一个提交按钮的窗口 不幸的是 最近我想我按下了一个按钮 图形编辑器将不再打
  • 如何在android中获取准确的UTC时间戳

    我不知道哪一个适合获取 UTC 时间 我的代码是 System currentTimeMillis 对于 java 安卓 国际化的结果正确吗 也许用户可以更改设备时间并且结果会有所不同 对UTC有影响吗 在Linux平台上 系统时钟应设置为
  • 在本地 NTFS 驱动器上查找回收站

    我正在尝试编写一些简单的代码 该代码将返回本地驱动器上回收站的目录 看起来很简单 谷歌上应该有一千个答案 还没找到 我发现 FAT 和 NTFS 驱动器具有不同的基本名称 RECYCLED 和 RECYCLER 我发现 回收站 是一个虚拟文