C#xattr文件属性
我正在创建一个跨平台的软件,我想知道是否有(简单的)方法可以读取/写入C#中的Unix(Mac OSX/Linux)扩展文件属性。 我刚刚读过关于C#xattr文件属性,c#,unix,xattr,C#,Unix,Xattr,我正在创建一个跨平台的软件,我想知道是否有(简单的)方法可以读取/写入C#中的Unix(Mac OSX/Linux)扩展文件属性。 我刚刚读过关于xattr名称空间的文章,但没有找到任何关于此功能的C#实现或绑定的信息 另外,到目前为止,我唯一发现的是python xattr库,但我不想使用它,因为: 我不想强制用户安装Python(已经有Mono/.NET依赖项需要处理) 使用Python会降低性能(编译C#,而解释Python) 我不想依赖外部工具(如果可能的话),因为它不安全 最终解决方
xattr
名称空间的文章,但没有找到任何关于此功能的C#实现或绑定的信息
另外,到目前为止,我唯一发现的是python xattr库,但我不想使用它,因为:
- 我不想强制用户安装Python(已经有Mono/.NET依赖项需要处理)
- 使用Python会降低性能(编译C#,而解释Python)
- 我不想依赖外部工具(如果可能的话),因为它不安全
- 文件属性管理器OS:使用DSOFile.dll管理高级属性*
- 文件属性管理Runix:使用IronPython*和python xattr管理高级属性**
[**]http:\\ironpython.codeplex.com
[***]http:\\pypi.python.org/pypi/xatt 扩展属性操作(例如
setProperty(字符串键,对象值)
和GetProperty(字符串键)
等)将在静态类(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对象的所有方法调用。我认为Mono.Unix.Native.Syscall.setxattr是一个更好的解决方案,它位于Mono.Posix模块中。您应该使用
Mono.Unix.Native.Syscall.*.attr*
中的系统调用nuget程序集被称为 请注意,名称-值对的名称以名称空间作为前缀
根据 当前,安全、系统、受信任和用户扩展属性 类的定义如下所述。可能需要额外的课程 在将来添加
通常,依赖外部库比编写自己的库要安全得多,因为它很可能有更少的bug。或者你所说的“安全”是指别的什么吗?@svick我想他所说的安全是可以管理的。C#是一种托管语言,python不是。@thekip是对的,我只想拥有一个完全托管的代码和可能的同构开发环境。我已经在使用C#作为粘合剂:D用于HTTP5+jQuery+JSON应用程序(在xulrunner中运行)、原生C#代码、SQLite/MySQL包装器实体提供程序等,通过添加一些其他(非托管)语言和工具,我当然不会让我的应用程序更稳定。不要使用静态类,使用抽象类@看看日期,是2011年!现在我们将使用DI注入正确版本的实现等。无论如何,请仔细阅读答案,它使用抽象类,静态类只是一个门面。再一次,今天,9年后,我会做不同的事情。
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