当前位置: 首页 > 面试题库 >

编写扩展文件属性快速示例

娄飞鸾
2023-03-14
问题内容

我正在寻找一种解决方案,以快速为文件添加扩展文件属性。我检查了此链接写扩展文件属性,但是解决方案在目标c中,我需要快速解决方案。


问题答案:

这是Swift 5中可能的实现,作为的扩展URL,带有获取,设置,列出和删除文件扩展属性的方法。(可在编辑历史记录中找到快速2、3和4代码。)

extension URL {

    /// Get extended attribute.
    func extendedAttribute(forName name: String) throws -> Data  {

        let data = try self.withUnsafeFileSystemRepresentation { fileSystemPath -> Data in

            // Determine attribute size:
            let length = getxattr(fileSystemPath, name, nil, 0, 0, 0)
            guard length >= 0 else { throw URL.posixError(errno) }

            // Create buffer with required size:
            var data = Data(count: length)

            // Retrieve attribute:
            let result =  data.withUnsafeMutableBytes { [count = data.count] in
                getxattr(fileSystemPath, name, $0.baseAddress, count, 0, 0)
            }
            guard result >= 0 else { throw URL.posixError(errno) }
            return data
        }
        return data
    }

    /// Set extended attribute.
    func setExtendedAttribute(data: Data, forName name: String) throws {

        try self.withUnsafeFileSystemRepresentation { fileSystemPath in
            let result = data.withUnsafeBytes {
                setxattr(fileSystemPath, name, $0.baseAddress, data.count, 0, 0)
            }
            guard result >= 0 else { throw URL.posixError(errno) }
        }
    }

    /// Remove extended attribute.
    func removeExtendedAttribute(forName name: String) throws {

        try self.withUnsafeFileSystemRepresentation { fileSystemPath in
            let result = removexattr(fileSystemPath, name, 0)
            guard result >= 0 else { throw URL.posixError(errno) }
        }
    }

    /// Get list of all extended attributes.
    func listExtendedAttributes() throws -> [String] {

        let list = try self.withUnsafeFileSystemRepresentation { fileSystemPath -> [String] in
            let length = listxattr(fileSystemPath, nil, 0, 0)
            guard length >= 0 else { throw URL.posixError(errno) }

            // Create buffer with required size:
            var namebuf = Array<CChar>(repeating: 0, count: length)

            // Retrieve attribute list:
            let result = listxattr(fileSystemPath, &namebuf, namebuf.count, 0)
            guard result >= 0 else { throw URL.posixError(errno) }

            // Extract attribute names:
            let list = namebuf.split(separator: 0).compactMap {
                $0.withUnsafeBufferPointer {
                    $0.withMemoryRebound(to: UInt8.self) {
                        String(bytes: $0, encoding: .utf8)
                    }
                }
            }
            return list
        }
        return list
    }

    /// Helper function to create an NSError from a Unix errno.
    private static func posixError(_ err: Int32) -> NSError {
        return NSError(domain: NSPOSIXErrorDomain, code: Int(err),
                       userInfo: [NSLocalizedDescriptionKey: String(cString: strerror(err))])
    }
}

用法示例:

let fileURL = URL(fileURLWithPath: "/path/to/file")

let attr1 = "com.myCompany.myAttribute"
let attr2 = "com.myCompany.otherAttribute"

let data1 = Data([1, 2, 3, 4])
let data2 = Data([5, 6, 7, 8, 9])

do {
    // Set attributes:
    try fileURL.setExtendedAttribute(data: data1, forName: attr1)
    try fileURL.setExtendedAttribute(data: data2, forName: attr2)

    // List attributes:
    let list = try fileURL.listExtendedAttributes()
    print(list)
    // ["com.myCompany.myAttribute", "com.myCompany.otherAttribute", "other"]

    let data1a = try fileURL.extendedAttribute(forName: attr1)
    print(data1a as NSData)
    // <01020304>

    // Remove attributes
    for attr in list {
        try fileURL.removeExtendedAttribute(forName: attr)
    }

} catch let error {
    print(error.localizedDescription)
}


 类似资料:
  • 问题内容: Swift提供了编写扩展的功能。我做了很多事情,以使我的代码更易于阅读。不知道它们是否无害。我想知道,由于性能原因,仅省略扩展会更好吗? 问题答案: Apple鼓励使用扩展名。你可以阅读更多关于他们的雨燕文档上这里。

  • 问题内容: 我正在学习swift,并制作了一个表格,其中包含显示图像的单元格,以及按MIME TYPE(使用路径扩展名)分组的类。我有一个关于扩展的问题。如果图像(例如,可能是视频或pdf)是从Internet上获取的,我不确定它们是否具有扩展名, 如何在不使用路径扩展名的情况下获取文件系统中文件的MIME类型? PS:很抱歉我的英语不好,这不是我的母语 问题答案: 假设您以NSData的形式接收

  • 我正在尝试将的接口扩展为: 但我得到了以下错误: 没有与此调用匹配的重载。重载1/3'(路径:PathParams,…处理程序:RequestHandler

  • 问题内容: 快速将NSDictionaries写入文件有局限性。根据我从api文档中学到的知识和这个答案,键类型应该是NSString,值类型也应该是NSx类型,并且Int,String和其他swift类型可能不起作用。问题是,如果我有一个像这样的字典:如何快速将其写入plist文件或从plist文件读取? 问题答案: 无论如何,当您要存储到文件时,它必须是协议的子类并符合协议。像这样: 然后,这

  • 问题内容: 如果我上课: 我最初以为我可以通过添加扩展名来覆盖子类而无需子类化: 该代码不会编译,但错误说明了该函数,这很有意义。 我的问题是: 是否仍要重写特定类的功能?换句话说,在某些情况下,例如上面的示例中,我可以替换功能吗?如果没有,是否有其他解决方法或方法来实现该行为(可能声明了另一个协议,idk) 现在,我考虑得更多了,我不得不说这是不可能的,因为是什么阻止某人重写任何标准库函数? 问

  • 问题内容: 我需要磁盘支持的Map结构才能在Java应用程序中使用。它必须具有以下条件: 能够存储数百万条记录(甚至数十亿条) 快速查找-地图上的大多数操作将仅查看密钥是否已存在。这和上面的1是最重要的标准。对于常用的密钥,应该有一种有效的内存缓存机制。 持久但不需要事务性,可以承受一些失败。即乐于定期与磁盘同步,并且不需要事务性。 能够存储简单的原始类型-但是我不需要存储序列化的对象。 它不需要