Sur iOS, vous pouvez obtenir la valeur correspondant à la clé d'attribut FileAttributeKey pour le fichier sur l'appareil. Il contient des informations telles que la date de création et de modification du fichier et la taille du fichier. La valeur définie pour FileAttributeKey peut être obtenue via la méthode attributesOfItem (atPath :) fournie par FileManager. Cependant, vous pouvez également définir vos propres attributs pour enregistrer / récupérer des informations supplémentaires. À titre d'exemple de la scène d'utilisation, lorsque le fichier sur S3 est téléchargé localement, les informations sur l'heure de mise à jour du fichier [LastModified](https://docs.aws.amazon.com/sdkfornet1/latest/apidocs/html/P_Amazon_S3_Model_S3Object_LastModified. Vous pouvez penser à des choses comme attribuer une valeur de htm) et l'utiliser pour la gestion synchrone des fichiers à partir de la prochaine fois.
Par souci de simplicité, les informations à enregistrer dans le code ci-dessous sont «String». Je pense qu'il est normal de cibler des types conformes à Codable
au lieu de String
.
extension URL {
///Obtenez des attributs étendus
func extendedAttribute(for name: String) -> String? {
let result = withUnsafeFileSystemRepresentation { fileSystemPath -> String? in
//Obtenez la taille des données d'attribut étendu correspondant au nom
let length = getxattr(fileSystemPath, name, nil, 0, 0, 0)
guard length >= 0 else {
return nil
}
//Sécuriser une zone pour stocker des données
var data = Data(count: length)
let result = data.withUnsafeMutableBytes { [count = data.count] in
//Obtenir des données pour les attributs étendus correspondant au nom
getxattr(fileSystemPath, name, $0.baseAddress, count, 0, 0)
}
guard result >= 0 else {
return nil
}
return String(data: data, encoding: .utf8)
}
return result
}
///Enregistrer les attributs étendus
@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 {
//Enregistrer les données d'attributs étendus correspondant au nom
setxattr(fileSystemPath, name, $0.baseAddress, data.count, 0, 0)
}
return result >= 0
}
return result
}
}
//Le nom de l'attribut étendu à définir
let key = "com.example.extended_attribute"
//Emplacement des fichiers pour la définition des attributs étendus
let url = FileManager.default.temporaryDirectory.appendingPathComponent("example_file")
//Si le fichier n'existe pas, créez-le et ajoutez des attributs étendus
if !FileManager.default.fileExists(atPath: url.path) {
let data = "example_content".data(using: .utf8)!
try! data.write(to: url)
//Accorder des attributs étendus
url.setExtendedAttribute(value: "example_value", for: key)
}
//Vérifier si des attributs étendus peuvent être obtenus
print(url.extendedAttribute(for: key))
Optional("example_value")
Même si vous redémarrez l'application, vous pouvez voir que la valeur enregistrée par setExtendedAttribute
peut être obtenue et que la valeur associée au fichier peut être conservée.
Recommended Posts