Unter iOS können Sie den Wert abrufen, der dem Attributschlüssel FileAttributeKey für die Datei auf dem Gerät entspricht. Es enthält Informationen wie das Datum, an dem die Datei erstellt und geändert wurde, und die Größe der Datei. Der für FileAttributeKey definierte Wert kann über die von FileManager bereitgestellte Methode attributeOfItem (atPath :) abgerufen werden. Sie können jedoch auch eigene Attribute festlegen, um zusätzliche Informationen zu speichern / abzurufen. Als Beispiel für die Verwendungsszene werden beim lokalen Herunterladen der Datei in S3 die Informationen zur Aktualisierungszeit für die Datei LastModified angezeigt. Sie können sich beispielsweise vorstellen, einen Wert von htm zuzuweisen und ihn ab dem nächsten Mal für die synchrone Verwaltung von Dateien zu verwenden.
Der Einfachheit halber sind die Informationen, die im folgenden Code gespeichert werden sollen, "String". Ich denke, es ist in Ordnung, auf Typen abzuzielen, die "Codable" anstelle von "String" entsprechen.
extension URL {
///Erhalten Sie erweiterte Attribute
func extendedAttribute(for name: String) -> String? {
let result = withUnsafeFileSystemRepresentation { fileSystemPath -> String? in
//Ermitteln Sie die Größe der erweiterten Attributdaten, die dem Namen entsprechen
let length = getxattr(fileSystemPath, name, nil, 0, 0, 0)
guard length >= 0 else {
return nil
}
//Sichern Sie einen Bereich zum Speichern von Daten
var data = Data(count: length)
let result = data.withUnsafeMutableBytes { [count = data.count] in
//Daten für erweiterte Attribute abrufen, die dem Namen entsprechen
getxattr(fileSystemPath, name, $0.baseAddress, count, 0, 0)
}
guard result >= 0 else {
return nil
}
return String(data: data, encoding: .utf8)
}
return result
}
///Speichern Sie erweiterte Attribute
@discardableResult
func setExtendedAttribute(value: String, for name: String) -> Bool {
guard let data = value.data(using: .utf8) else {
return false
}
let result = withUnsafeFileSystemRepresentation { fileSystemPath -> Bool in
let result = data.withUnsafeBytes {
//Speichern Sie erweiterte Attributdaten entsprechend dem Namen
setxattr(fileSystemPath, name, $0.baseAddress, data.count, 0, 0)
}
return result >= 0
}
return result
}
}
//Der Name des zu setzenden erweiterten Attributs
let key = "com.example.extended_attribute"
//Speicherort der Dateien zum Festlegen erweiterter Attribute
let url = FileManager.default.temporaryDirectory.appendingPathComponent("example_file")
//Wenn die Datei nicht vorhanden ist, erstellen Sie sie und fügen Sie erweiterte Attribute hinzu
if !FileManager.default.fileExists(atPath: url.path) {
let data = "example_content".data(using: .utf8)!
try! data.write(to: url)
//Erweiterte Attribute gewähren
url.setExtendedAttribute(value: "example_value", for: key)
}
//Überprüfen Sie, ob erweiterte Attribute erhalten werden können
print(url.extendedAttribute(for: key))
Optional("example_value")
Selbst wenn Sie die Anwendung neu starten, können Sie sehen, dass der durch "setExtendedAttribute" gespeicherte Wert abgerufen werden kann und der mit der Datei verknüpfte Wert beibehalten werden kann.
Recommended Posts