我正在创建一个跨平台的软件,我想知道是否有任何(简单)方法在C#中读/写Unix(Mac OSX / Linux)扩展文件属性。
我刚刚阅读了xattr
命名空间,但我没有找到有关C#实现或此功能绑定的任何信息。
P.S。到目前为止我唯一发现的是python-xattr库,但我不想使用它,因为:
答案 0 :(得分:1)
您应该在Mono.Unix.Native.Syscall.*attr*
中使用系统调用。
nuget程序集称为Mono.Posix.NETStandard
请注意,名称/值对的名称以命名空间为前缀。
根据man 7 xattr
当前,安全性,系统,可信和用户扩展属性 类的定义如下所述。其他类别可能是 将来添加。
public static void Test()
{
string path = "/root/Desktop/CppSharp.txt";
// Mono.Unix.Native.Syscall.getxattr()
// Mono.Unix.Native.Syscall.fgetxattr()
// Mono.Unix.Native.Syscall.lgetxattr()
// Mono.Unix.Native.Syscall.setxattr()
// Mono.Unix.Native.Syscall.fsetxattr()
// Mono.Unix.Native.Syscall.lsetxattr
// Mono.Unix.Native.Syscall.llistxattr()
// Mono.Unix.Native.Syscall.flistxattr()
// Mono.Unix.Native.Syscall.llistxattr()
// Mono.Unix.Native.Syscall.removexattr()
// Mono.Unix.Native.Syscall.fremovexattr()
// Mono.Unix.Native.Syscall.lremovexattr()
if (System.IO.File.Exists(path))
System.Console.WriteLine("path exists");
else
System.Console.WriteLine("path doesn't exists");
System.Text.Encoding enc = new System.Text.UTF8Encoding(false);
string[] values = null;
int setXattrSucceeded = Mono.Unix.Native.Syscall.setxattr(path, "user.foobar",
enc.GetBytes("Hello World äöüÄÖÜ"), Mono.Unix.Native.XattrFlags.XATTR_CREATE);
if (setXattrSucceeded == -1)
{
Mono.Unix.Native.Errno er = Mono.Unix.Native.Stdlib.GetLastError();
string message = Mono.Unix.Native.Stdlib.strerror(er);
// https://stackoverflow.com/questions/12662765/how-can-i-get-error-message-for-errno-value-c-language
System.Console.WriteLine(message);
} // End if (setXattrSucceeded == -1)
byte[] data = null;
long szLen = Mono.Unix.Native.Syscall.getxattr(path, "user.foobar", out data);
string value = enc.GetString(data);
System.Console.WriteLine(value);
Mono.Unix.Native.Syscall.listxattr(path, System.Text.Encoding.UTF8, out values);
System.Console.WriteLine(values);
// https://man7.org/linux/man-pages/man2/getxattr.2.html
} // End Sub TestExtendedAttributes
答案 1 :(得分:0)
最终解决方案可能如下,请告诉我您的想法是什么?
FileAttrsManager 是一个抽象类,用于创建2个派生类:
[*] http:\\ www.microsoft.com/download/en/details.aspx?displaylang=en&id=8422
[**] http:\\ ironpython.codeplex.com
[** *] http:\\ pypi.python.org/pypi/xatt
扩展属性操作(例如SetPropery(string key, object value)
和GetProperty(string key)
等)将在静态类( FileAttrsProvider )中进行管理,该类初始化 FileAttrsManager 反对两种派生类型之一,即:
public static class FileAttrProvider
{
private static FileAttrReader _reader = null;
public static void Initialize()
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.MacOSX:
case PlatformID.Unix:
_reader = new FileAttrReaderUnix();
break;
case PlatformID.Win32NT:
_reader = new FileAttrReaderDos();
break;
}
}
}
虽然派生类型取决于环境,但使用原始类型是为了确保自动调度_reader对象上的所有方法调用。)
答案 2 :(得分:0)
我认为Mono.Unix.Native.Syscall.setxattr是一个更好的解决方案,它在Mono.Posix模块中。