Comment tester l'existence d'une "clé" dans un fichier plist?

Bonjour à tous,

Je lis les informations du système à l’aide de la commande suivant qui fonctionne très bien.

Var ud As String
Shell1.Execute ("defaults read com.apple.screencapture location")
ud = Shell1.Result
MessageBox(ud) //pour l'exemple.

Hors parfois (souvent), la clé n’existe pas et est créée dans le fichier plist lors d’une modification.
C’est le cas pour les clés ‘location’ et ‘type’ par exemple (voir code ci-dessous), qui n’apparaissent QUE si vous modifiez l’emplacement des captures ou l’extension des images.
Du coup, mon code génère une erreur et ne renvoie pas la chaine ou valeur escomptée mais une chaine, ou une valeur, quelconque sans intérêt.
D’ou ma question : comment tester l’existence ou non d’une clé ?

Exemple de fichier com.apple.screencapture.plist :

{
    "last-analytics-stamp" = "667905350.104239";
    "last-selection" =     {
        Height = 945;
        Width = 1680;
        X = 284;
        Y = "149.5";
    };
    "last-selection-display" = 0;
    **location** = "/Users/dedubo/Desktop/";
    "location-last" = "~/Documents/";
    target = file;
    **type** = jpg;
}

Merci.

C’est quoi une “clé” ?

Bonjour,
Ce que j’appelle “clé” c’est le nom avant la valeur/chaine dans un fichier plist :
“location” = …
“target” =…
“type” = …

1 Like

Avec les plugins MBS:

dim pref as new CFPreferencesMBS
dim appId as new CFStringMBS("com.apple.screencapture")
dim key as new CFStringMBS("location-last")
dim value as variant = pref.CopyValue(key, appID, CFPreferencesMBS.kCFPreferencesCurrentUser, CFPreferencesMBS.kCFPreferencesAnyHost)

if value isa CFStringMBS then
  dim v as CFStringMBS = value
  dim s as string = v.str
  MessageBox s
end if

Pour la clé location-last, mais vous pouvez essayer “location” comme la clé.

1 Like

ceci ne ressemble pas du tout à du xml …
si c’est juste pour savoir si une clé existe, un simple Instr suffit
si c’est pour avoir la valeur de la clé, c’est plus compliqué mais on doit s’en sortir avec un regex.
cela ressemble à du JSON sans en être vraiment ?

Merci Christian :smiley:, je vais regarder cela de près cette semaine.

@Christian_Schmitz
Ah oui, j’ai juste besoin de savoir si une clé, passée en paramètre (par exemple ‘location’, etc.) existe avec une fonction qui retourne juste true/false.
C’est faisable avec ce Plugin ?
(il est dans quelle bibliotheque ? Plugins/Utils ?)
Merci.

“un simple Instr suffit” : si tu pouvais développer un peu…
Pour lire la valeur de la clé, c’est pas un problème avec un ShellExecute(“default read…”)
Merci.

if ud.instr("""valeur-de-ma-cle"" = ")>=0 then
// ma clé existe
else
// ma clé n'existe pas
end if

instr recherche une chaine à l’intérieur d’une autre chaine.
https://documentation.xojo.com/api/deprecated/instr.html
ou indexof si tu as un xojo >2019r2
https://documentation.xojo.com/api/data_types/string.html#string-indexof

Merci bien. Je testerais demain. Effectivement j’ai la dernière version de Xojo. Donc IndexOf() me semble plus indiqué.

Voici un exemple:

“UneClé”=“Voici ““valeur-de-ma-cle”””
… faux positif.

alors un regex pour ca aussi donc …
même si vu le contenu du fichier ca risque peu d’arriver…

On dirait que. la commande InStr est périmée :
This item was deprecated in version 2019r2 .
Please use [String.IndexOf] (https://documentation.xojo.com/api/data_types/string.html#string-indexof) as a replacement.

Tu as oublié ta propre réponse. Matin difficile ? :wink:

1 Like