ディレクトリツリー(ディレクトリの場合は0755、ファイルの場合は644)で正しいアクセス権を確保したい。ここに私のクラスは次のとおりです。chmod -R 755を模倣するjava walkFileTreeが機能しない
package NRF_Utils;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import static java.nio.file.FileVisitResult.*;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
import java.util.logging.Logger;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
public class DirectoryTreeOperations {
private static final Logger log = Logger.getLogger("spv." + DirectoryTreeOperations.class.getName());
public static boolean setPermissions(String root, String directoryPermissions, String filePermissions) {
boolean result = true;
//declaring the path to delete
final Path path = Paths.get(root);
final Set<PosixFilePermission> dirPermissions = PosixFilePermissions.fromString(directoryPermissions);
final Set<PosixFilePermission> filPermissions = PosixFilePermissions.fromString(filePermissions);
try {
Files.walkFileTree(path, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
System.out.println("setting dir permission on " + dir);
Files.setPosixFilePermissions(dir, dirPermissions);
return CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
System.out.println("setting file permission on " + file);
Files.setPosixFilePermissions(file, filPermissions);
return CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
log.severe("visitFileFailed failed on " + file + " : " + exc);
return CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) throws IOException {
return CONTINUE;
}
});
} catch (IOException e) {
log.severe("setPermissions failed " + e);
result = false;
}
return result;
}
// TODO remove and provide a proper unit test
public static void main(String [] arg) {
System.out.println ("setPermissions returned: " + setPermissions("/tmp/x", "rwxr-xr-x", "rw-r--r--"));
}
}
テストを実行するには、私が行っている:
mkdir -p /tmp/x/y/z;touch /tmp/x/y/z/f;chmod 000 /tmp/x/y/z
出力は次のとおりです。
setting dir permission on /tmp/x
setting dir permission on /tmp/x/y
setPermissions returned: true
nov. 26, 2017 2:45:00 PM NRF_Utils.DirectoryTreeOperations$1 visitFileFailed
GRAVE: visitFileFailed failed on /tmp/x/y/z : java.nio.file.AccessDeniedException: /tmp/x/y/z
Javaがあるため、ディレクトリツリーを探索したくないようです権限は間違っていますが、私の目的はディレクトリツリーを調べて権限を修正することでした。 APIはクレイジーですか?
のchmod 000は、まったくの読み取り/書き込みアクセス権がないことを意味します。そのため、 'AccessDeniedException'で正しく失敗しています。あなたのコードを 'root'ユーザとして実行すると動作するかもしれません! – RaviH
chmod -R 755は完全にユーザーとして動作します。ルートの必要はありません。 – BOC
詳細については、rootとして動作します。なぜシェルコマンドchmod -RをネイティブのJavaコードに置き換えるのが難しいのか分かりません。私はちょうどスクリプトを呼び出すことを避けたい。 – BOC