【问题标题】:How does USB Disk Ejector work?USB Disk Ejector 是如何工作的?
【发布时间】:2026-01-28 07:45:01
【问题描述】:

我有一个设计为在可移动驱动器上运行的 Java 应用程序。我想添加一个按钮,以允许用户在USB Disk Ejector 允许的情况下安全地删除程序运行的驱动器。但是,我不确定如何实现这一点(代码方面),因为如果程序正在从驱动器运行,则无法弹出驱动器。我知道这个程序是开源的,但我不知道在哪里可以找到我要查找的代码,而且它不是用我学过的语言编写的。

因此,如果有人能帮助我弄清楚如何在我的 Java 应用程序中实现此功能,我将不胜感激。显然我不想只是复制,但我现在唯一知道的是我必须将控制权交给某种临时脚本,该脚本不在我希望弹出的驱动器上。

提前致谢

【问题讨论】:

    标签: java windows usb-drive


    【解决方案1】:

    据我所知,这是不可能在纯 Java 中实现的,因为诸如弹出/卸载驱动器之类的操作是特定于操作系统的,并且不包含在通常只支持最低公分母的默认 Java 库中。您需要通过执行脚本/批处理文件或运行编写的本机代码来执行一些特定于平台的代码,例如在 C 中使用 Java 的 JNI 机制。

    【讨论】:

    • 我确实有一个可执行文件,它允许我通过命令行安全地删除驱动器,我计划从一个临时文件运行它。但是问题是我不知道如何运行可执行文件,因为在运行应用程序时无法弹出驱动器。我需要以某种方式启动一个脚本,等待主应用程序退出,然后尝试安全删除驱动器,但是(代码方面)我实际上不确定如何执行此操作
    【解决方案2】:

    您是对的,您需要从另一个驱动器运行该应用程序。我会按照Java Web Start CD Install 指南进行操作,该指南对 USB 驱动器或任何其他媒体的使用效果与对 CD 的使用效果一样好。

    您需要使您的应用程序成为 Java Web Start 应用程序。它实际上比听起来容易得多。您的 .jar 不需要更改,您只需创建一个扩展名为 .jnlp 的小型 XML 文件并将其放在 .jar 文件旁边。有关 Java Web Start 和 JNLP 文件的信息可以在 the tutorial 和该页面底部的链接中找到。

    执行安全删除的外部可执行文件可以包含在您的应用程序 .jar 文件中。您可以将其从 .jar 复制到临时文件中以运行它:

    Path safeRemovalProgram = Files.createTempFile(null, ".exe");
    try (InputStream stream =
            MyApp.class.getResourceAsStream("saferemoval.exe")) {
        Files.copy(stream, safeRemovalProgram,
            StandardCopyOption.REPLACE_EXISTING);
    }
    safeRemovalProgram.toFile().setExecutable(true);
    
    ProcessBuilder builder =
        new ProcessBuilder(safeRemovalProgram.toString());
    builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    Process safeRemovalProcess = builder.start();
    

    【讨论】:

    • 感谢您的回答。我理解这个概念,我认为它可以工作,但是我认为 Web Start 会损害我的应用程序的图像和可移植性,因为我希望它被包装为 exe 并从可移动驱动器运行。我猜想通过使用 Web Start,驱动器实际上并没有运行任何东西?
    • CD 安装链接描述了如何制作 install.bat(或 setup.bat 等)。如果需要,我想你甚至可以让它与 Autorun 一起工作。但我承认它不会像单个可点击的可执行文件那样具有相同的易用性。 Web Start 通常(总是?)缓存应用程序,但我不知道它是否会继续将原始未导入的 .jar 文件锁定在 Windows 中。