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

Java程序式弹出可移动驱动器前,如何检测其是否被占用?

检测可移动驱动器占用状态的实现方案

纯Java实现的局限性

Java标准库没有提供直接检测文件或驱动器是否被系统占用的API,这类操作属于系统级资源管理,不同操作系统的实现逻辑差异极大,Java的跨平台抽象层未覆盖该场景,无法通过纯Java代码完成跨平台的占用检测。

跨平台Shell命令方案(Java调用)

可以通过Java调用系统Shell命令,针对Windows和macOS分别实现检测逻辑:

Windows平台

方案:使用PowerShell查询关联进程

执行以下PowerShell命令,替换D:为目标驱动器号:

Get-Process | Where-Object {$_.Modules.FileName -like "D:\*"}

若命令返回非空结果,说明驱动器存在被占用的文件。

Java调用示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class DriveChecker {
    public static boolean isDriveInUseWindows(String driveLetter) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("powershell.exe", "-Command", 
            "Get-Process | Where-Object {$_.Modules.FileName -like \"" + driveLetter + "\\*\"}");
        Process process = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        boolean inUse = false;
        while ((line = reader.readLine()) != null) {
            if (!line.trim().isEmpty()) {
                inUse = true;
                break;
            }
        }
        process.waitFor();
        return inUse;
    }
}

macOS平台

使用lsof命令查询挂载的驱动器,替换/Volumes/MyDrive为目标驱动器的挂载路径:

lsof /Volumes/MyDrive

命令返回非空结果则表示驱动器被占用。

Java调用示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class DriveChecker {
    public static boolean isDriveInUseMac(String drivePath) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("lsof", drivePath);
        Process process = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        boolean inUse = false;
        // 跳过表头行
        reader.readLine();
        while ((line = reader.readLine()) != null) {
            if (!line.trim().isEmpty()) {
                inUse = true;
                break;
            }
        }
        process.waitFor();
        return inUse;
    }
}

注意事项

  • Windows的PowerShell方案需要确保用户有足够权限查询进程模块信息;
  • macOS的lsof命令若要查看所有进程可能需要sudo权限,普通权限下可能无法检测到部分系统级进程的占用;
  • 可通过System.getProperty("os.name")判断当前操作系统,自动选择对应命令执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:14:56