2015-02-12 2 views
-3

Вот ссылка на пример: https://docs.oracle.com/javase/tutorial/essential/io/examples/Chmod.javaКак запустить этот Chmod.java?

Код в этом примере следующим образом:

import java.nio.file.*; 
import java.nio.file.attribute.*; 
import static java.nio.file.attribute.PosixFilePermission.*; 
import static java.nio.file.FileVisitResult.*; 
import java.io.IOException; 
import java.util.*; 

public class Chmod { 

    public static Changer compile(String exprs) { 
     // minimum is who and operator (u= for example) 
     if (exprs.length() < 2) 
      throw new IllegalArgumentException("Invalid mode"); 

     // permissions that the changer will add or remove 
     final Set<PosixFilePermission> toAdd = new HashSet<PosixFilePermission>(); 
     final Set<PosixFilePermission> toRemove = new HashSet<PosixFilePermission>(); 

     // iterate over each of expression modes 
     for (String expr: exprs.split(",")) { 
      // minimum of who and operator 
      if (expr.length() < 2) 
       throw new IllegalArgumentException("Invalid mode"); 

      int pos = 0; 

      // who 
      boolean u = false; 
      boolean g = false; 
      boolean o = false; 
      boolean done = false; 
      for (;;) { 
       switch (expr.charAt(pos)) { 
        case 'u' : u = true; break; 
        case 'g' : g = true; break; 
        case 'o' : o = true; break; 
        case 'a' : u = true; g = true; o = true; break; 
        default : done = true; 
       } 
       if (done) 
        break; 
       pos++; 
      } 
      if (!u && !g && !o) 
       throw new IllegalArgumentException("Invalid mode"); 

      // get operator and permissions 
      char op = expr.charAt(pos++); 
      String mask = (expr.length() == pos) ? "" : expr.substring(pos); 

      // operator 
      boolean add = (op == '+'); 
      boolean remove = (op == '-'); 
      boolean assign = (op == '='); 
      if (!add && !remove && !assign) 
       throw new IllegalArgumentException("Invalid mode"); 

      // who= means remove all 
      if (assign && mask.length() == 0) { 
       assign = false; 
       remove = true; 
       mask = "rwx"; 
      } 

      // permissions 
      boolean r = false; 
      boolean w = false; 
      boolean x = false; 
      for (int i=0; i<mask.length(); i++) { 
       switch (mask.charAt(i)) { 
        case 'r' : r = true; break; 
        case 'w' : w = true; break; 
        case 'x' : x = true; break; 
        default: 
         throw new IllegalArgumentException("Invalid mode"); 
       } 
      } 

      // update permissions set 
      if (add) { 
       if (u) { 
        if (r) toAdd.add(OWNER_READ); 
        if (w) toAdd.add(OWNER_WRITE); 
        if (x) toAdd.add(OWNER_EXECUTE); 
       } 
       if (g) { 
        if (r) toAdd.add(GROUP_READ); 
        if (w) toAdd.add(GROUP_WRITE); 
        if (x) toAdd.add(GROUP_EXECUTE); 
       } 
       if (o) { 
        if (r) toAdd.add(OTHERS_READ); 
        if (w) toAdd.add(OTHERS_WRITE); 
        if (x) toAdd.add(OTHERS_EXECUTE); 
       } 
      } 
      if (remove) { 
       if (u) { 
        if (r) toRemove.add(OWNER_READ); 
        if (w) toRemove.add(OWNER_WRITE); 
        if (x) toRemove.add(OWNER_EXECUTE); 
       } 
       if (g) { 
        if (r) toRemove.add(GROUP_READ); 
        if (w) toRemove.add(GROUP_WRITE); 
        if (x) toRemove.add(GROUP_EXECUTE); 
       } 
       if (o) { 
        if (r) toRemove.add(OTHERS_READ); 
        if (w) toRemove.add(OTHERS_WRITE); 
        if (x) toRemove.add(OTHERS_EXECUTE); 
       } 
      } 
      if (assign) { 
       if (u) { 
        if (r) toAdd.add(OWNER_READ); 
         else toRemove.add(OWNER_READ); 
        if (w) toAdd.add(OWNER_WRITE); 
         else toRemove.add(OWNER_WRITE); 
        if (x) toAdd.add(OWNER_EXECUTE); 
         else toRemove.add(OWNER_EXECUTE); 
       } 
       if (g) { 
        if (r) toAdd.add(GROUP_READ); 
         else toRemove.add(GROUP_READ); 
        if (w) toAdd.add(GROUP_WRITE); 
         else toRemove.add(GROUP_WRITE); 
        if (x) toAdd.add(GROUP_EXECUTE); 
         else toRemove.add(GROUP_EXECUTE); 
       } 
       if (o) { 
        if (r) toAdd.add(OTHERS_READ); 
         else toRemove.add(OTHERS_READ); 
        if (w) toAdd.add(OTHERS_WRITE); 
         else toRemove.add(OTHERS_WRITE); 
        if (x) toAdd.add(OTHERS_EXECUTE); 
         else toRemove.add(OTHERS_EXECUTE); 
       } 
      } 
     } 

     // return changer 
     return new Changer() { 
      @Override 
      public Set<PosixFilePermission> change(Set<PosixFilePermission> perms) { 
       perms.addAll(toAdd); 
       perms.removeAll(toRemove); 
       return perms; 
      } 
     }; 
    } 

    /** 
    * A task that <i>changes</i> a set of {@link PosixFilePermission} elements. 
    */ 
    public interface Changer { 
     /** 
     * Applies the changes to the given set of permissions. 
     * 
     * @param perms 
     *   The set of permissions to change 
     * 
     * @return The {@code perms} parameter 
     */ 
     Set<PosixFilePermission> change(Set<PosixFilePermission> perms); 
    } 

    /** 
    * Changes the permissions of the file using the given Changer. 
    */ 
    static void chmod(Path file, Changer changer) { 
     try { 
      Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file); 
      Files.setPosixFilePermissions(file, changer.change(perms)); 
     } catch (IOException x) { 
      System.err.println(x); 
     } 
    } 

    /** 
    * Changes the permission of each file and directory visited 
    */ 
    static class TreeVisitor implements FileVisitor<Path> { 
     private final Changer changer; 

     TreeVisitor(Changer changer) { 
      this.changer = changer; 
     } 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { 
      chmod(dir, changer); 
      return CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { 
      chmod(file, changer); 
      return CONTINUE; 
     } 

     @Override 
     public FileVisitResult postVisitDirectory(Path dir, IOException exc) { 
      if (exc != null) 
       System.err.println("WARNING: " + exc); 
      return CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) { 
      System.err.println("WARNING: " + exc); 
      return CONTINUE; 
     } 
    } 

    static void usage() { 
     System.err.println("java Chmod [-R] symbolic-mode-list file..."); 
     System.exit(-1); 
    } 

    public static void main(String[] args) throws IOException { 
     if (args.length < 2) 
      usage(); 
     int argi = 0; 
     int maxDepth = 0; 
     if (args[argi].equals("-R")) { 
      if (args.length < 3) 
       usage(); 
      argi++; 
      maxDepth = Integer.MAX_VALUE; 
     } 

     // compile the symbolic mode expressions 
     Changer changer = compile(args[argi++]); 
     TreeVisitor visitor = new TreeVisitor(changer); 

     Set<FileVisitOption> opts = Collections.emptySet(); 
     while (argi < args.length) { 
      Path file = Paths.get(args[argi]); 
      Files.walkFileTree(file, opts, maxDepth, visitor); 
      argi++; 
     } 
    } 
} 

Во-первых, я использую Netbeans IDE. Я очень мало знаю, как работает chmod, потому что я не пользователь Linux. Как это должно работать chmod.java? В принципе, вам не нужно все объяснять, поскольку я узнаю его сам, если код уже работает.

Вот аргументы я примерил NetBeans

-R u+w,o-rwx C:\Users\Josh\Desktop\chin.txt 

Но это дает ошибку

Exception in thread "main" java.lang.UnsupportedOperationException 
    at  sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:192) 
at java.nio.file.Files.readAttributes(Files.java:1737) 
at java.nio.file.Files.getPosixFilePermissions(Files.java:2004) 
at chmod.Chmod.chmod(Chmod.java:269) 
at chmod.Chmod$TreeVisitor.visitFile(Chmod.java:294) 
at chmod.Chmod$TreeVisitor.visitFile(Chmod.java:279) 
at java.nio.file.Files.walkFileTree(Files.java:2670) 
at chmod.Chmod.main(Chmod.java:336) 

Java Результат: 1

+3

Я голосующий, чтобы закрыть этот вопрос как не по теме, потому что это не истинный вопрос, а вопиющий просить код. Это не то, для чего этот сайт. –

+1

'' В принципе, вам не нужно все объяснять, потому что я сам его изучу ». - Этот вопрос демонстрирует иначе. – David

+0

@HovercraftFullOfEels Я не прошу прощения, код уже есть, мне просто нужно его работать. Например, как правильно использовать его, чтобы заставить его работать через аргументы. – John

ответ

1

Вы используете файловую систему Windows, и CHMOD ожидает файловой системы который поддерживает POSIX; что Windows, ну, нет.

В качестве доказательства, попытайтесь сделать это:

final FileSystem fs = FileSystems.getDefault(); // <-- that's your filesystem 
System.out.println(fs.supportedFileAttributeViews()); 

Вы не увидите posix отображается.

Если вы хотите, чтобы играть с ним, попытаться использовать memoryfilesystem которые действительно есть способ построить FileSystem с Unix-подобными возможностями:

final FileSystem fs = MemoryFileSystemBuilder.newLinux() 
    .build("testfs"); 

// fs.getPath() etc 

Также посмотрите на this project, с помощью которого вы можете сделать что:

MoreFiles.setMode(somePath, 0644); // for instance 
Смежные вопросы