【问题标题】:C# xattr file attributesC# xattr 文件属性
【发布时间】:2011-11-25 05:53:46
【问题描述】:

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

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

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

【问题讨论】:

  • 很多时候,依赖外部库比编写自己的库更安全,因为它很可能有更少的错误。或者您所说的“安全”是指别的什么意思?
  • @svick 我认为他所说的安全是管理的。 C# 是一种托管语言,而 python 不是。
  • @thekip 是对的,我只想拥有一个完全托管的代码和可能的同构开发环境。我已经将 C# 用作 HTTP5+jQuery+JSON 应用程序(在 xulrunner 中运行)、本机 C# 代码、SQLite/MySQL 包装器实体提供程序等的胶水:D 通过添加一些其他(非托管)语言和工具,我肯定会赢t 让我的应用更稳定。

标签: c# unix xattr


【解决方案1】:

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

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

  • FileAttrsManagerDos:使用 DSOFile.dll* 管理高级属性
  • FileAttrsManagerUnix:使用 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

扩展属性操作(例如 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 对象上的所有方法调用。

【讨论】:

  • 不要对静态类执行此操作,为此使用 ABSTRACT 类!
  • @StefanSteiger 看看日期,是 2011 年!现在我们将使用 DI 注入正确版本的实现等。无论如何请仔细阅读答案,它使用抽象类,静态类只是一个门面。同样,9 年后的今天,我会以不同的方式做这件事。
【解决方案2】:

我认为 Mono.Unix.Native.Syscall.setxattr 会是一个更好的解决方案,它在 Mono.Posix 模块中。

【讨论】:

    【解决方案3】:

    您应该使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2016-05-28
      • 2010-09-18
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多