Comment récupérer cette propriété de fichier qui apparaît dans la liste de répertoires Windows?

0

Je souhaite extraire une propriété de fichier inhabituelle qu'un package logiciel (OrcaFlex) ajoute lors de la création d'un fichier. Dans l'Explorateur Windows, lorsque je passe la souris sur la liste de fichiers telle que SomeSimulation.sim dans la première capture d'écran ci-dessous, une fenêtre contextuelle apparaît avec les propriétés, y compris "État du modèle". Ici J'ai appris qu'on les appelle infotips. Je souhaite récupérer la valeur d'état du modèle (la chaîne "Dynamique de domaine temporel complète") à l'aide de Perl ou de tout autre langage de ligne de commande. Comment je fais ça? J'utilise Windows 7 et le commentaire de James m'a aidé à voir que je devrais utiliser ce peut-être comme ce .

file listing

KAE
la source
Je crois que cela est géré par une extension du shell implémentant le GetInfoTip mais je ne sais pas, c’est réaliste de l’appeler en dehors d’Explorer sans beaucoup de travail.
James P
Est-ce un exemple d'utilisation de GetInfoTip pour extraire les informations de C ++? msdn.microsoft.com/en-us/library/windows/desktop/… et est-ce un exemple en Python? blog.gmane.org/gmane.comp.python.windows/month=20090501/page=4 Je veux savoir que je suis dirigé dans la bonne direction car je ne connais pas beaucoup le C ++ ou le python.
KAE
1
Malheureusement non, il s’agit d’implémenter la fonction dans une extension du shell. Quelque chose comme cela pourrait être pertinent cependant: stackoverflow.com/questions/5721700/… .
James P

Réponses:

1

Je suis l'un des auteurs d'OrcaFlex. Sans aucune garantie, le code Python ci-dessous vous permettra de trouver ce dont vous avez besoin.

import struct

def readModelStateText(fileName):
    with open(fileName, 'rb') as f:
        content = f.read(0x4000) # hope that the text appears this early in the file
    signature = b'\xff\xfa\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    index = content.find(signature)
    if index == -1:
        return '<model state not found>'
    index += len(signature) + 2 # skip over block length
    stringLength = struct.unpack('<H', content[index:index + 2])[0]
    index += 2
    return content[index:index + stringLength].decode('utf-8')

Ceci recherche un bloc spécifique dans le fichier avec connaissance de la signature de l'en-tête de bloc. Il est plausible (très peu probable, je suppose) que le code trouve le corps d'un bloc précédent qui correspond à la signature. Et il y a d'autres manières pour que ce code échoue.

Je ne fais que l'offrir parce que c'est peut-être utile, mais avec une lourde mise en garde.

David Heffernan
la source
Je n'ai plus d'accès OrcaFlex, donc je ne peux pas confirmer, mais j'apprécie la réponse!
KAE
1
J'ai un accès OrcaFlex ;-) et ça marche bien !! Cela a été soulevé parce qu'un autre utilisateur a demandé la même fonctionnalité et a répondu à cette question. J'ai donc pensé pouvoir répondre ici aussi.
David Heffernan
0

Mon collègue intelligent a remarqué que la chaîne "Dynamique de domaine temporel complète" est en fait dans le fichier binaire à un stade précoce. J'ai donc utilisé grep sans interagir avec Windows, ce qui est un soulagement,

head -10 SomeSimulation.sim | grep "Time domain dynamics complete"
KAE
la source