首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# xattr文件属性

C# xattr文件属性
EN

Stack Overflow用户
提问于 2011-09-26 13:48:11
回答 3查看 839关注 0票数 3

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

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

  • 我不想要求用户安装Python (已经存在Mono/.NET依赖关系)
  • 通过使用Python,我将降低性能(编译C#,而解释Python )
  • 我不想依赖/依赖外部工具(如果可能的话),因为它不安全
EN

回答 3

Stack Overflow用户

发布于 2020-07-15 17:33:18

您应该在Mono.Unix.Native.Syscall.*attr*中使用syscalls。

nuget程序集称为Mono.Posix.NETStandard

请注意,名称-值对的名称以命名空间为前缀。

根据7人xattr

当前,安全性、系统、受信任和用户扩展属性类定义如下。将来可能会添加其他类。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-10-01 16:40:25

最后的解决办法可能是以下几点,告诉我你怎么想?

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

  • FileAttrsManagerDos:使用DSOFile.dll*管理高级属性
  • FileAttrsManagerUnix:使用IronPython*和python**管理高级属性。

* 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)等)将在静态类FileAttrsManager中进行管理,该类将将FileAttrsManager对象初始化为两种派生类型之一,即:

代码语言:javascript
复制
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对象的所有方法调用)。

票数 0
EN

Stack Overflow用户

发布于 2014-01-10 02:56:08

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7556082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档