Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#xattr文件属性_C#_Unix_Xattr - Fatal编程技术网

C#xattr文件属性

C#xattr文件属性,c#,unix,xattr,C#,Unix,Xattr,我正在创建一个跨平台的软件,我想知道是否有(简单的)方法可以读取/写入C#中的Unix(Mac OSX/Linux)扩展文件属性。 我刚刚读过关于xattr名称空间的文章,但没有找到任何关于此功能的C#实现或绑定的信息 另外,到目前为止,我唯一发现的是python xattr库,但我不想使用它,因为: 我不想强制用户安装Python(已经有Mono/.NET依赖项需要处理) 使用Python会降低性能(编译C#,而解释Python) 我不想依赖外部工具(如果可能的话),因为它不安全 最终解决方

我正在创建一个跨平台的软件,我想知道是否有(简单的)方法可以读取/写入C#中的Unix(Mac OSX/Linux)扩展文件属性。 我刚刚读过关于
xattr
名称空间的文章,但没有找到任何关于此功能的C#实现或绑定的信息

另外,到目前为止,我唯一发现的是python xattr库,但我不想使用它,因为:

  • 我不想强制用户安装Python(已经有Mono/.NET依赖项需要处理)
  • 使用Python会降低性能(编译C#,而解释Python)
  • 我不想依赖外部工具(如果可能的话),因为它不安全

最终解决方案可能如下,请告诉我您的想法

FileAttrsManager是一个抽象类,用于创建两个派生类:

  • 文件属性管理器OS:使用DSOFile.dll管理高级属性*
  • 文件属性管理Runix:使用IronPython*和python xattr管理高级属性**
[*]http:\\www.microsoft.com/download/en/details.aspx?displaylang=en&id=8422
[**]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