gpt4 book ai didi

java - UNIX 设置扩展属性 setxattr

转载 作者:行者123 更新时间:2023-11-30 10:59:18 24 4
gpt4 key购买 nike

- 如何在 UNIX 中编写 UserDefinedFileAttributes?

- 如何在 UNIX 中设置 setxattr?


我正在 UNIX 服务器上使用我在 Windows 中制作的 java 程序。作为其中的一部分,我使用 UserDefinedFileAttributeView 将扩展文件信息写入文件。

我有一个文件系统是否支持 UserDefinedFileAttributeView 的测试:

public static String[] supportedFileAttributeViews() {
final FileSystem defaultFS = FileSystems.getDefault();
return defaultFS.supportedFileAttributeViews()
.toArray(new String[defaultFS.supportedFileAttributeViews().size()]);
}

在 UNIX 服务器上,这给了我:

"basic" "owner" "user"  "unix"  "dos"   "posix"

所以我想可以将 UserDefinedFileAttributes 写入文件 (-->"user")

但是如果 java 写入文件我会得到一个错误:

java.nio.file.FileSystemException: .... 
Error writing extended attribute 'test': Operation not supported
at sun.nio.fs.LinuxUserDefinedFileAttributeView.write
(LinuxUserDefinedFileAttributeView.java:246)
........

我编写 UserDefinedFileAttributes 的代码:

public static boolean writeCustomMETAfile(String filepath,String name, String value) {
boolean succes = false;
try {
Path file = Paths.get(filepath);
UserDefinedFileAttributeView userView = Files.getFileAttributeView(file, UserDefinedFileAttributeView.class);
//userView.write(name, Charset.defaultCharset().encode(value));

final byte[] bytes = value.getBytes("UTF-8");
final ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
writeBuffer.put(bytes);
writeBuffer.flip();

userView.write(name, writeBuffer);
succes = true;

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return succes;
}

我一直在搜索 StackOverflow 和各种手册 (UNIX) 和其他网络资源,但直到现在都没有找到。

在 UNIX 命令行上:

man 2 setxattr

给我一​​些信息,我尝试了各种 chmod 设置。

它可以在 i 节点中吗?:

An i-node holds most of the metadata for a
Unix file — on classic Unix, it holds all but the
i-node number itself

所以问题是:- 如何在 UNIX 中编写 UserDefinedFileAttributes/如何在 UNIX 中设置 setxattr?

最佳答案

在下面找到一个小片段,它将在文件上读取和写入 xattr。为简单起见,没有适当的异常处理。

Path path = Paths.get("/tmp/foobar");

// you should get the filestore for the path
FileStore fileStore = Files.getFileStore(path);
System.out.println("fileStore : " + fileStore);

// check if the filesystem supports xattr
//
// I found out that the reported state might be wrong for ext3/ext4
//
// if you create following properties file it will be correct
// echo "ext4=user_attr" > $JAVA_HOME/lib/fstypes.properties
//
// keep in mind that it's possible that your ext3/ext4 does not support xattr
// might be related to: kernel configuration, mount options, etc.
boolean supportsXattr = fileStore.supportsFileAttributeView(UserDefinedFileAttributeView.class);
System.out.println("supports xattr: " + supportsXattr);

// get the file attribute view
UserDefinedFileAttributeView view = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class);
String xattrName = "xattr-foo";
String xattrValue = "dummy-value";

Charset defaultCharset = Charset.defaultCharset();
if (view.list().contains(xattrName)) {
// get the size of the attribute value
int xattrSize = view.size(xattrName);
ByteBuffer buffer = ByteBuffer.allocateDirect(xattrSize);

// read the attribute value
int bytesRead = view.read(xattrName, buffer);

// decode the buffer and print it
buffer.flip();
xattrValue = defaultCharset.decode(buffer).toString();
System.out.println("xattr name : " + xattrName);
System.out.println("xattr value : " + xattrValue);
} else {
// edit: System.out.println to System.out.printf in the next line
System.out.printf("file has no xattr [%s]%n", xattrName);
}

// write the current value back reversed, can be checked next run
// or on command line
String newXattrValue = new StringBuilder(xattrValue).reverse().toString();
view.write(xattrName, defaultCharset.encode(newXattrValue);

编辑 我在github 上推送了一个完整的示例.它也应该适用于 Windws 上的 NTFS 分区。

扩展属性可以在 Linux 上设置为

setfattr -n user.foo_name -v bar_value /tmp/foobar

并且可以检索为

getfattr -n user.foo_name /tmp/foobar

关于java - UNIX 设置扩展属性 setxattr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31919453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com