You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java在Windows系统中程序化恢复回收站文件?

在Windows中通过Java实现回收站文件恢复的方案

核心结论

Windows回收站的存储机制和Mac废纸篓存在本质区别,无法直接通过重命名/移动回收站中的文件完成恢复操作。这是因为Windows回收站里的文件并非以原文件名直接存放,而是被系统重命名后保存在各分区的隐藏$Recycle.Bin目录中,同时配套生成$I开头的元数据文件,记录原文件路径、删除时间等关键信息。

可行实现方案

1. 调用Windows Shell API(基于JNA)

Windows系统的Shell32.dll提供了SHFileOperation函数,原生支持回收站的文件恢复操作。可以通过JNA(Java Native Access)直接调用该API,无需编写JNI代码:

  • 先在项目中引入JNA依赖(以Maven为例):
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.13.0</version>
</dependency>
  • 实现恢复功能的代码片段:
import com.sun.jna.platform.win32.Shell32;
import com.sun.jna.platform.win32.ShlObj;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.Win32Exception;

public class RecycleBinRestore {
    public static void restoreFromRecycleBin(String recycledFilePath) {
        ShlObj.SHFILEOPSTRUCT fileOp = new ShlObj.SHFILEOPSTRUCT();
        fileOp.wFunc = Shell32.FO_RESTORE;
        // 路径必须以双空字符结尾,这是SHFileOperation的要求
        fileOp.pFrom = recycledFilePath + "\0\0";
        // 静默执行,不弹出确认对话框
        fileOp.fFlags = ShlObj.FOF_NOCONFIRMATION | ShlObj.FOF_SILENT;

        WinNT.HRESULT result = Shell32.INSTANCE.SHFileOperation(fileOp);
        if (result.intValue() != 0) {
            throw new Win32Exception(result);
        }
    }
}

2. 执行PowerShell命令

通过Java调用PowerShell,利用Windows的Shell.Application COM对象来定位并恢复回收站中的文件:

import java.io.IOException;

public class PowerShellRecycleRestore {
    public static void restoreFile(String originalFilePath) throws IOException {
        // 命令逻辑:遍历回收站项,匹配原路径后执行恢复操作
        String psCommand = String.format(
            "powershell -Command \"$shell = New-Object -ComObject Shell.Application; " +
            "$recycleBin = $shell.Namespace(0xa); " +
            "$recycleBin.Items() | Where-Object {$_.Path -eq '%s'} | ForEach-Object {$_.InvokeVerb('Restore')}\"",
            originalFilePath.replace("'", "''")
        );
        Runtime.getRuntime().exec(psCommand);
    }
}

重要注意事项

  • Windows回收站按磁盘分区隔离,每个分区下的$Recycle.Bin目录包含对应用户SID的子文件夹,文件被重命名为$R开头的文件名,配套的$I文件存储原路径等元数据
  • 恢复操作必须依赖系统API或COM对象,直接移动$Recycle.Bin中的文件会导致元数据丢失,系统无法识别为合法的回收站恢复操作,可能丢失文件的原始属性和路径信息

内容的提问来源于stack exchange,提问作者mstoreysmith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:36:24