0

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 つが初期化された直後に終了します。

理由はありますか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

1

しかし、2 つの docx ファイルを開くと、プロセスの 1 つが初期化された直後に存在します。

おそらく、winword.exeプロセスは、実行中のインスタンスが既に 1 つあることを検出したため、2 つのインスタンスをメモリに保持する代わりに、最初のインスタンスに 2 番目のドキュメントを開くように要求するだけです。GUI の観点からはわかりませんが、タスク マネージャーを見て、Windows エクスプローラーから Word 文書を 2 つ開いてみてください。2 番目のファイルによって 2 番目のwinword.exeプロセスが開始されることはありません。

Ubuntu Linux でもまったく同じ動作を再現できます。私が走ったとき:

$ geany foo.txt

geanyエディターがまだ実行されていないため、エディターを閉じるまでコンソールがハングします。しかし、代わりに別の端末を開いて呼び出すと:

$ geany bar.txt

これはすぐに返され、bar.txt既存のプロセスの別のタブとして開かれます。

于 2012-10-31T19:45:44.467 に答える