使用java更改unix文件的组
如何使用JavaAPI更改一组文件? 我知道我可以使用使用java更改unix文件的组,java,nio,Java,Nio,如何使用JavaAPI更改一组文件? 我知道我可以使用Files.setOwner(Java7)来设置文件的所有者 如何在Unix操作系统上更改文件的组 解决方案: UserPrincipalLookupService lookupservice = FileSystems.getDefault() .getUserPrincipalLookupService(); final UserPrincipal superuser = lookupservice .lookupPrin
Files.setOwner
(Java7)来设置文件的所有者
如何在Unix操作系统上更改文件的组
解决方案:
UserPrincipalLookupService lookupservice = FileSystems.getDefault()
.getUserPrincipalLookupService();
final UserPrincipal superuser = lookupservice
.lookupPrincipalByName("superuser");
final GroupPrincipal servicesGroup = lookupservice
.lookupPrincipalByGroupName("services");
FileVisitor<Path> visitor = new FileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path file,
BasicFileAttributes attrs) throws IOException {
setOwnerAndGroupForFile(superuser, servicesGroup, file);
File[] listFiles = file.toFile().listFiles();
for (File file1 : listFiles) {
Files.walkFileTree(file1.toPath(), this);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
setOwnerAndGroupForFile(superuser, servicesGroup, file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file,
IOException exc) throws IOException {
outputError("Problems while accesing file " + file);
return FileVisitResult.CONTINUE;
}
private void setOwnerAndGroupForFile(final UserPrincipal superuser,
final GroupPrincipal servicesGroup, Path file)
throws IOException {
Files.setOwner(file, superuser);
PosixFileAttributeView fileAttributeView = Files
.getFileAttributeView(file, PosixFileAttributeView.class);
fileAttributeView.setGroup(servicesGroup);
}
};
Files.walkFileTree(Paths.get(dataDirectoryFile.toURI()), visitor);
userprincipalookupservice lookupservice=FileSystems.getDefault()
.getUserPrincipalLookupService();
final UserPrincipal superuser=lookupservice
.lookupPrincipalByName(“超级用户”);
最终组主体服务组=lookupservice
.lookupPrincipalByGroupName(“服务”);
FileVisitor=新FileVisitor(){
@凌驾
公共文件VisitResult postVisitDirectory(路径目录,
IOException exc)抛出IOException{
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult preVisitDirectory(路径文件,
BasicFileAttributes(属性属性)引发IOException{
setOwnerAndGroupForFile(超级用户、服务组、文件);
File[]listFiles=File.toFile().listFiles();
对于(文件文件1:listFiles){
walkFileTree(file1.toPath(),this);
}
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult visitFile(路径文件,
BasicFileAttributes(属性属性)引发IOException{
setOwnerAndGroupForFile(超级用户、服务组、文件);
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult visitFileFailed(路径文件,
IOException exc)抛出IOException{
outputError(“访问文件时出现问题”+文件);
返回FileVisitResult.CONTINUE;
}
私有void setOwnerAndGroupForFile(最终用户Principal superuser,
最终组主体服务组,路径文件)
抛出IOException{
Files.setOwner(文件,超级用户);
PosixFileAttributeView fileAttributeView=文件
.getFileAttributeView(文件,PosixFileAttributeView.class);
fileAttributeView.setGroup(servicesGroup);
}
};
Files.walkFileTree(path.get(dataDirectoryFile.toURI()),visitor);
您应该能够与POSIX系统一起使用。我将查看JCraft的JSch库(Java安全通道)。它对java执行SSH,允许您作为用户进行身份验证,然后向您的内容发出chmod
或chown
请求
您可以提供一组
PosixFilePermission
实例来模拟chmod命令:
//using PosixFilePermission to set file permissions 777
Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
//add owners permission
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_EXECUTE);
//add group permissions
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
//add others permissions
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
Files.setPosixFilePermissions(Paths.get("path/to/file"), perms);
//使用PosixFilePermission设置文件权限777
Set perms=new HashSet();
//添加所有者权限
perms.add(PosixFilePermission.OWNER\u READ);
perms.add(PosixFilePermission.OWNER\u WRITE);
perms.add(PosixFilePermission.OWNER\u EXECUTE);
//添加组权限
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP\u EXECUTE);
//添加其他权限
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
setPosixFilePermissions(path.get(“path/to/file”)、perms);
原因的可能重复:File[]listFiles=File.toFile().listFiles();对于(文件file1:listFiles){Files.walkFileTree(file1.toPath(),this);}
??可能与Brilliant.重复。。!谢谢你的回复。@MandarKulkarni不客气。请考虑接受其中一个答案,如果它们覆盖了您的问题中的所有内容。技术上,我没有任何异常,调试消息确实表明代码遍历了每个目录/子目录和文件的更改组。但是,当我在unix框上执行“ls-l”时,我看不到这些文件的修改组/所有者?有什么想法吗?@MandarKulkarni我现在没有什么东西可以测试。在上下文中考虑<代码>主< /代码>和<代码>超级用户< /代码>之间的差异。它实际上应该更改组还是它以前所在的组?它应该更改组和所有者。默认情况下,所有文件都将root作为所有者和组。