我使用Runtime.getRuntime().exec(String cmd)函数打开office文件(docx、xlsx)。同时,我将这些文件的元数据存储在数据库中。为了保持完整性,我在元数据中使用一个标志锁定文件,这样其他用户就不能同时修改该文件。这意味着在用户关闭文件(例如,关闭外部进程)后,必须自动重置该标志。
以下是打开该文件的代码片段:
File file = new File("c:/test.docx");
Process process = null;
if(file.getName().endsWith("docx")) {
process = Runtime.getRuntime().exec("c:/msoffice/WINWORD.EXE "+file.getAbsolutePath());
} else if(file.getName().endsWith("xlsx")) {
process = Runtime.getRuntime().exec("c:/msoffice/EXCEL.EXE "+file.getAbsolutePath());
}
if(process!=null) {
new ProcessExitListener(file, process);
}
下面是我的监听器,它会一直等到用户关闭文件(最后通过在元数据中设置标志来解锁文件):
private class ProcessExitListener extends Thread {
private File file;
private Process process;
public ProcessExitListener(File file, Process process) throws IOException {
this.setName("File-Thread ["+process.toString()+"]");
this.file = file;
this.process = process;
this.start();
}
@Override
public void run() {
try {
process.waitFor();
database.unlock(file);
} catch (InterruptedException ex) {
// print exception
}
}
}
这适用于不同的文件类型,例如,如果我同时打开1个docx和1个xlsx文件。但当打开两个docx文件时,其中一个进程在初始化后立即退出。
你知道为什么吗?
提前感谢您的帮助!
发布于 2012-11-01 03:45:44
,但当打开2个docx文件时,其中一个进程在初始化后立即存在。
可能是因为winword.exe
进程发现它已经有一个实例在运行,所以它不是在内存中保留两个实例,而是只要求第一个实例打开第二个文档。我不知道从GUI的角度看它是什么样子,但是看看任务管理器,试着从Windows资源管理器打开两个Word文档。第二个文件不会导致启动第二个winword.exe
进程。
我可以在Ubuntu Linux上重现完全相同的行为。当我跑的时候:
$ geany foo.txt
而且geany编辑器还没有运行,控制台会挂起,直到我关闭编辑器。但如果我打开另一个终端并调用:
$ geany bar.txt
这会立即返回,并且bar.txt
只是作为现有进程中的另一个选项卡打开。
https://stackoverflow.com/questions/13166314
复制相似问题