سؤال

لذلك أحاول كتابة ملف .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.سيكون جزءًا من مجموعة ميزات IO الجديدة، والتي يمكنك قراءة المزيد عنها هنا.

في جافا 7 يمكنك الاتصال <لأ href = "https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#setPosixFilePermissions(java.nio.file. المسار،٪ 20java.util.Set) "يختلط =" نوفولو noreferrer "> 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، إلى جانب شمود + س، لديك لإعطاء تمديد .command لشيل الخاص بك إذا كنت ترغب في إطلاقه مع النقر المزدوج.

هذه الإجابة كتبت ل و كيف يمكنني برمجيا تغيير أذونات الملف يظهر شمود مثلا عن طريق مكالمة الأم باستخدام الجيش الشعبي اليوغوسلافي، والتي يجب أن تعمل على نظام التشغيل Mac OS X.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top