回答:
Java 7では、「新しい」新しいIO機能(NIO.2)の一部として、ファイル属性を完全に制御できます。例えば、POSIXアクセス権が持つ既存のファイルに設定することができsetPosixFilePermissions()
、またはアトミックのような方法でファイルの作成時createFile()
またはnewByteChannel()
。
を使用して一連の権限を作成できますEnumSet.of()
が、ヘルパーメソッドPosixFilePermissions.fromString()
は、多くの開発者にとって読みやすい従来の形式を使用します。を受け入れるAPIのFileAttribute
場合、一連の権限をでラップできますPosixFilePermissions.asFileAttribute()
。
Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);
以前のバージョンのJavaでは、独自のネイティブコードを使用するか、exec
-ingコマンドラインユーティリティを使用するのが一般的なアプローチです。
エリクソンの提案に加えて、jnaもあります、jniを使用せずにネイティブライブラリを呼び出すことができます。驚くほど簡単に使用でき、いくつかのプロジェクトで使用して、大きな成功を収めています。
唯一の注意点は、jniよりも低速であるため、これを非常に多数のファイルに対して実行すると、問題になる可能性があります。
(例を追加するための編集)
次に、完全なjna chmodの例を示します。
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Main {
private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class);
public static void main(String[] args) {
libc.chmod("/path/to/file", 0755);
}
}
interface CLibrary extends Library {
public int chmod(String path, int mode);
}
Java 6より前のバージョンでは、Javaレベルでのファイル許可の更新はサポートされていません。独自のネイティブメソッドを実装するかRuntime.exec()
、chmodなどのOSレベルのコマンドを実行するために呼び出す必要があります。
Java 6以降では、を使用File.setReadable()/File.setWritable()/File.setExecutable()
してファイルのアクセス権を設定できます。ただし、さまざまなユーザーに権限を設定できるPOSIXファイルシステムはシミュレートしません。File.setXXX()は、所有者と他のすべてのユーザーにのみ許可を設定できます。
Java 7から、POSIXファイル許可が導入されました。* nixシステムで行ったように、ファイル許可を設定できます。構文は次のとおりです。
File file = new File("file4.txt");
file.createNewFile();
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
Files.setPosixFilePermissions(file.toPath(), perms);
このメソッドはPOSIXファイルシステムでのみ使用できます。つまり、Windowsシステムでは呼び出すことができません。
ファイルのアクセス許可管理の詳細については、この投稿を読むことをお勧めします。
nio 2.0を搭載したWindows 7の場合:
public static void main(String[] args) throws IOException
{
Path file = Paths.get("c:/touch.txt");
AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class);
System.out.println(aclAttr.getOwner());
for(AclEntry aclEntry : aclAttr.getAcl()){
System.out.println(aclEntry);
}
System.out.println();
UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService();
UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name"));
AclEntry.Builder builder = AclEntry.newBuilder();
builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE,
AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS,
AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE
));
builder.setPrincipal(user);
builder.setType(AclEntryType.ALLOW);
aclAttr.setAcl(Collections.singletonList(builder.build()));
}
作成したファイルに777権限を設定する場合は、次の方法を使用できます。
public void setPermission(File file) throws IOException{
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
Files.setPosixFilePermissions(file.toPath(), perms);
}
JDK 6以降は使用できるので、誰かが後でこれに遭遇しない限り、この回答を更新するだけです
File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);
ドキュメントは、Oracle File(Java Platform SE 7)にあります。これらのコマンドは、現在作業中のユーザーがそのファイルの所有権または書き込みアクセス権を持っている場合にのみ機能することに注意してください。OPがより複雑なユーザー構成のためにchmodタイプのアクセスを必要としていたことを知っています。これらは、すべてのユーザーに対して全面的にオプションを設定します。
Fileクラスのメソッドを使用できます。http: //docs.oracle.com/javase/7/docs/api/java/io/File.html
Oralce Java 6の場合:
private static int chmod(String filename, int mode) {
try {
Class<?> fspClass = Class.forName("java.util.prefs.FileSystemPreferences");
Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE);
chmodMethod.setAccessible(true);
return (Integer)chmodMethod.invoke(null, filename, mode);
} catch (Throwable ex) {
return -1;
}
}
solaris / linuxで動作します。
FileSystemPreferences
読み込まれると、Timer
デーモンスレッドが起動されることに注意してください。また、シャットダウンフックも追加されますが、一部のアプリケーションでは、これが依然として問題となる場合があります。
@msorskyと共有されるApache ant chmod(非常にエレガントではない、完全性のために追加)クレジット
Chmod chmod = new Chmod();
chmod.setProject(new Project());
FileSet mySet = new FileSet();
mySet.setDir(new File("/my/path"));
mySet.setIncludes("**");
chmod.addFileset(mySet);
chmod.setPerm("+w");
chmod.setType(new FileDirBoth());
chmod.execute();
simple java code for change file permission in java
String path="D:\\file\\read.txt";
File file=new File(path);
if (file.exists()) {
System.out.println("read="+file.canRead());
System.out.println("write="+file.canWrite());
System.out.println("Execute="+file.canExecute());
file.setReadOnly();
}
リファレンス:Javaでファイルのアクセス許可を変更する方法
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
public class FileAndDirectory1 {
public static void main(String[] args) {
File file = new File("fileTest1.txt");
System.out.println(file.getAbsoluteFile());
try {
//file.createNewFile();
if(!file.exists())
{
//PosixFilePermission is an enum class, PosixFilePermissions is a final class
//create file permissions from string
Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
Files.createFile(file.toPath(), permissions);
// printing the permissions associated with the file
System.out.println("Executable: " + file.canExecute());
System.out.println("Readable: " + file.canRead());
System.out.println("Writable: "+ file.canWrite());
file.setExecutable(true);
file.setReadable(true);
file.setWritable(true);
}
else
{
//modify permissions
//get the permission using file attributes
Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
perms.remove(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
Files.setPosixFilePermissions(file.toPath(), perms);
System.out.println("Executable: " + file.canExecute());
System.out.println("Readable: " + file.canRead());
System.out.println("Writable: "+ file.canWrite());
file.delete();
}
} catch (IOException e) {
e.printStackTrace();
}
Path path = Paths.get(String.valueOf(file));
System.out.println(path);
}
}
Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))