Вопрос

Итак, я пытаюсь написать файл .sh, который будет исполняемым, вот как я сейчас его пишу:

Writer output = null;

try {
  output = new BufferedWriter(new FileWriter(file2));
  output.write(shellScriptContent);
  output.close();
} catch (IOException ex) {
  Logger.getLogger(PunchGUI.class.getName()).log(Level.SEVERE, null, ex);
}

Так что записывает файл просто отлично, но он не является исполняемым.Есть ли способ изменить статус исполняемого файла, когда я его пишу?

Редактировать:Чтобы еще раз уточнить, я пытаюсь заставить его выполняться по умолчанию, чтобы, например, если вы дважды щелкнете по сгенерированному файлу, он автоматически выполнялся.

Это было полезно?

Решение

Вам нужно было бы изменить его, и вы, вероятно, можете сделать это, выполнив системную команду, подобную такой:

На самом деле все, что вам нужно, это запустить что-то вроде этого:

Runtime.getRuntime().exec("chmod u+x "+FILENAME);

Но если вы хотите отслеживать это более явно, можете захватить stdin / stderr, а затем что-то более похожее:

Process p = Runtime.getRuntime().exec("chmod u+x "+FILENAME);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));    
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

Который я получил отсюда:http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Обновить:

Тестовая программа:

package junk;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Main{
  private String scriptContent = '#!/bin/bash \n echo "yeah toast!" > /tmp/toast.txt';
  public void doIt(){
    try{
      Writer output = new BufferedWriter(new FileWriter("/tmp/toast.sh"));
      output.write(scriptContent);
      output.close();
      Runtime.getRuntime().exec("chmod u+x /tmp/toast.sh");
    }catch (IOException ex){}
  }

  public static void main(String[] args){
    Main m = new Main();
    m.doIt();
  }

}

В Linux, если вы откроете файловый браузер и дважды щелкните на /tmp/toast.sh и решите запустить его, он должен сгенерировать текстовый файл /tmp/toast.txt со словами "yeah toast".Я предполагаю, что Mac сделал бы то же самое, поскольку это BSD под капотом.

Другие советы

Ты можешь позвонить File.setExecutable() чтобы установить исполняемый бит владельца для файла, которого может быть достаточно в вашем случае.Или вы можете просто chmod это самостоятельно с помощью системного вызова с Process.

Увы, полноценное программное изменение прав доступа к файлам доступно только в Java 7.Это будет частью Нового набора функций ввода-вывода, о котором вы можете прочитать подробнее здесь.

В Java 7 вы можете вызвать Files.setPosixFilePermissions.Вот один из примеров:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Set;

class FilePermissionExample {
  public static void main(String[] args) throws IOException {
    final Path filepath = Paths.get("path", "to", "file.txt");
    final Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(filepath);
    permissions.add(PosixFilePermission.OWNER_EXECUTE);
    Files.setPosixFilePermissions(filepath, permissions);
  }
}

В Mac OS X, помимо chmod + x, вы должны предоставить .command расширение к вашему сценарию командной оболочки, если вы хотите запустить его двойным щелчком мыши.

Этот ответ Я написал для этого вопроса как мне программно изменить права доступа к файлам показывает пример chmod с помощью встроенного вызова с использованием jna, который должен работать в Mac OS X.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top