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

