[SWIFT] Ajouter des attributs étendus au fichier

introduction

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.

Exemple d'implémentation

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
  }
}

Vérifiez le fonctionnement

//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))

Sortie de la console

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.

référence

Recommended Posts

Ajouter des attributs étendus au fichier
4 Ajoutez println à l'interpréteur
Comment ajouter la fonction de suppression
Ajouter un horodatage au nom de fichier JAR dans Gradle
Fichier de migration pour ajouter un commentaire à la table Rails
[Java] Comment utiliser la classe File
Comment ajouter un fichier jar dans ScalaIDE
Je voulais ajouter @VisibleForTesting à la méthode
Essayez de changer le fichier .erb en .slim
[Rails 6] cocoon_ Ajouter des attributs d'identifiant et de données au formulaire à ajouter
Ajouter JDK au conteneur de l'agent TeamCity Build
Double-cliquez pour ouvrir le fichier jar sous Windows
Ajouter classpath: au chemin spécifié dans spring.datasource.schema
Ajouter un fichier jar obtenu de Maven à IntelliJ
[Spring Boot] Comment se référer au fichier de propriétés
Ajouter un fichier au fichier jar
[Java] Comment extraire le nom du fichier du chemin
JavaFX-Spécifiez l'emplacement du fichier CSS par rapport au fichier fxml
Comment déboguer le fichier jar généré avec Eclipse
Supprimez complètement le fichier de migration que vous n'avez pas réussi à supprimer
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Ajouter une icône au lien d'en-tête en utilisant Rails fontawesome
Comment ajouter des éléments sans spécifier la longueur du tableau
Comment ajouter les mêmes index dans un tableau imbriqué
Ajouter une ombre au bouton Swift (et aussi au cercle)
Comment modifier le contenu du fichier jar sans décompresser
Le fichier de migration est dupliqué
9 Correspond à la valeur de retour
Comment ajouter la fonction ActionText
12 Correspond à l'instruction while
Sortie javaDoc dans un fichier Word
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
Sortie de l'arborescence XML dans un fichier
[Rails] Ajouter une colonne à concevoir
[Rails] Supprimer le fichier de migration
Entrée dans la console Java
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
Il ne répond pas à la description en .js du fichier packs
Fixez le nom du fichier de guerre à celui défini dans Maven
[Eclipse] Je souhaite ouvrir le même fichier deux fois [Éditeur fractionné]
Méthode pour additionner le nombre d'années et obtenir la fin du mois
Je veux ajouter l'option désactivée à f.radio_button en fonction de la condition
[JQuery] Comment afficher l'image sélectionnée sous forme d'aperçu immédiat + Ajouter une gemme de publication d'image
[chown] Comment changer le propriétaire d'un fichier ou d'un répertoire
J'ai créé un outil pour afficher la différence du fichier CSV
Comment obtenir la longueur d'un fichier audio avec Java