このコードでファイルのアクセス許可を変更しています:
Runtime.getRuntime().exec("chmod 600 '/home/user/Desktop/file'");
でも効果なし!ls -l /home/user/Desktop/file
コード実行レポートの前後:
-rw-rw-r-- 1 evir evir 7928 Jul 31 14:54 file
何が問題ですか?
このコードでファイルのアクセス許可を変更しています:
Runtime.getRuntime().exec("chmod 600 '/home/user/Desktop/file'");
でも効果なし!ls -l /home/user/Desktop/file
コード実行レポートの前後:
-rw-rw-r-- 1 evir evir 7928 Jul 31 14:54 file
何が問題ですか?
あなたが尋ねた質問はあなたのシステムと環境に非常に特有です。
だから私は、何が起こったのか(または起こらなかったのか)を判断するために出力を見る必要があることを指摘することによって、より広い質問に答えます-そして男性に釣りをするように教えます-。
まず、Process
返されるインスタンスexec
を変数に割り当てる必要があります。ファイアアンドフォーゲットは、機能する場合は便利ですが、機能しない場合は、何が起こったのかを判断する方法がまったくありません。
最初に停止するのは、呼び出しprocess.waitFor()
です。これは、プロセスが終了するのを待って、終了コードを返します。これがゼロ以外の場合、正しく実行されませんでした。プロセスによっては、どのクラスのエラーが発生したかがわかる場合もあります。
これで問題を解決できない場合は、とに何が出力されたかを確認する必要がstdout
ありstderr
ます。process.getInputStream()
とをそれぞれ呼び出すことで、これらのストリームを読み取るためのハンドルを取得できますprocess.getErrorStream()
。これらのストリームを取得したら、通常どおりにそれらからバイトを読み取ります。
(データを処理するかどうかに関係なく、当然のことながら、これらのストリームから実際に読み取る必要があることに注意してください。バッファを満たすのに十分な出力を書き込むプロセスは、「もう一方の端」(あなた!)がそれのいくつかを読んでください。あなたのchmod
例では、それが問題になる可能性は低いですが。)
これで、終了ステータス、stdout、およびstderrストリームにアクセスできます。実際、コンソール内でプロセスを実行した場合に得られるすべてのものです。現在残っているのは、その情報を使用して特定の問題を解決することだけです...
するのはもっと簡単ではないでしょうか:
File file = new File("/home/user/Desktop/file");
file.setReadable(true, true);
file.setWritable(true, true);
file.setExecutable(false, false);
そうすれば、システム固有のコマンドライン呼び出しに入るのを避けることができます...