Runtime.getRuntime().exec(String cmd) 関数を使用して、オフィス ファイル (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 ファイルを同時に開いた場合など、さまざまなファイル タイプに対して正常に機能します。しかし、2 つの docx ファイルを開くと、プロセスの 1 つが初期化された直後に終了します。
理由はありますか?
事前にご協力いただきありがとうございます。