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

MacOS Sonoma下Java启动Word进程PID获取及文件释放检测咨询

问题描述

我在MacBook Pro上运行一个基于Java 19的Swing应用,应用允许用户打开Microsoft Word .docx文件进行编辑,目前通过以下代码实现:

Runtime.getRuntime().exec(CMD); 
CMD[0] = "open";
CMD[1] = "-a";
CMD[2] = "Microsoft Word";
CMD[3] = inc.getAbsoluteFilePath(fileName);
Process p = Runtime.getRuntime().exec(CMD);
PID = p.pid();

Microsoft Word能正常打开文件。

应用需要监控文件的大小、修改时间,以及Word实例是否仍在运行。这部分在Windows上可通过检测文件锁定实现,但在Mac上无法生效。

我用ps -elfT查询返回的PID时,找不到对应的进程,推测该PID属于open进程而非启动后的Microsoft Word进程。

请问有没有最佳方案可以判断用户何时释放文件,以便应用处理已保存的文件?


解决方案

方案1:让open命令等待Word进程退出

使用open命令的-W参数,让open进程一直等待打开的Microsoft Word退出后才结束,这样Java的Process对象就能直接监听Word的退出事件:

CMD[0] = "open";
CMD[1] = "-a";
CMD[2] = "Microsoft Word";
CMD[3] = "-W"; // 添加等待参数,阻塞到Word关闭
CMD[4] = inc.getAbsoluteFilePath(fileName);
Process p = Runtime.getRuntime().exec(CMD);
// 阻塞线程直到Word退出
int exitCode = p.waitFor();
// 此处执行文件处理逻辑,此时用户已关闭Word

方案2:精准跟踪Word进程与文件占用

  1. 启动Word后,用pgrep获取Word的实际PID:
    pgrep -x "Microsoft Word"
    
    在Java中执行该命令拿到PID,之后定时检查该PID是否存在(通过kill -0 <PID>判断进程存活)。若用户打开多个Word实例,可结合lsof筛选出正在占用目标文件的进程:
    lsof | grep "<目标文件绝对路径>" | grep "Microsoft Word"
    
  2. 定时执行上述命令,当无输出时,说明文件已被Word释放。

方案3:用AppleScript查询Word的文件状态

通过AppleScript直接查询Microsoft Word是否还在打开目标文件,在Java中通过osascript执行脚本:

tell application "Microsoft Word"
    return (every document whose full name is "<目标文件绝对路径>") exists
end tell

当脚本返回false时,说明文件已被Word关闭或释放,此时可触发文件处理逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:22:38