12
votes

FileTime à __int64

Quel est le moyen approprié de convertir une structure filétime en __ int64 ? Pouvez-vous s'il vous plaît dites-moi?


0 commentaires

6 Réponses :


16
votes

Je ne pense pas que vous êtes supposé que vous êtes supposé: "Ne pas lancer un pointeur sur une structure de filétime à un ULarge_Integer * ou __ int64 * < / Code> Valeur car il peut provoquer des défauts d'alignement sur des fenêtres 64 bits. "

source.

Si vous vouliez vraiment que ce soit quelque chose comme: xxx

mais quelque chose comme: < / p> xxx

est mauvais.


3 commentaires

Que diriez-vous MEMCY (<__ INT64>, & FileTime, 8); ? Est-ce sûr?


Je trouverais memcpy plus difficile à comprendre, mais je suis sûr que cela fonctionnerait. Le compilateur peut probablement optimiser le changement et le meilleur.


En effet, il était plus difficile de comprendre, mais cela a travaillé jusqu'à présent :) merci



5
votes

Essayez xxx


0 commentaires

0
votes

Bien sûr, vous pourriez simplement passer dans une extension int 2004 à une filetime comme suit * (FileTime *) & INT64VAL. Cela fonctionnera bien sous Visual C ++.

IE P>

__int64 createTime = 0;
__int64 accessTime = 0;
__int64 writeTime = 0;
GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );


3 commentaires

"Ne pas jeter un pointeur sur une structure de filétime à une valeur ULarge_Integer * ou __int64 * car elle peut provoquer des défauts d'alignement sur des fenêtres 64 bits." docs.microsoft.com/en-us/ Windows / Bureau / API / MINWINBASE / ...


@MRTUX: Dans le lien, il dit que vous ne devez pas être jeté d'une structure de filétime. Les 2 significations sont très différentes. Fondamentalement, un filétime peut être sur un alignement de 4 octets (ou peut-être même une 2) et ainsi de lancer à un __int64 entraînera des problèmes d'alignement en tant que __int64, soit nécessairement 8 octets alignés. Cependant, dans la fonction ci-dessus, je passe dans un __int64 aligné à 8 octets et Windows écrit. Cela ne change pas l'adresse du pointeur simplement parce que c'est un __int64. Cela briserait toutes sortes de choses.


Vraiment comme cette réponse, car il est parfaitement logique à la lumière de la signification réelle de la documentation conseille; et le Description de Raimond Chen . Merci tor-intelligent conseiller!



16
votes

Il n'est pas nécessaire de revenir à des constructions d'arcanes à l'aide de Bitwise ou de Bitwise. L'API Windows a tout ce dont vous avez besoin pour faire cela. xxx

ou si vous voulez aller à __int64 directement. xxx


1 commentaires

Ces jours-ci (depuis C ++ 11), il peut simplement être écrit en tant que UlargeInteger {ft.dwlowdatetime, ft.dwhighttetime} .quadpartate . Sans doute pas plus lisible, mais vous n'avez pas besoin de fonction / macro supplémentaire.



0
votes

Vous pouvez essayer le code suive. Le code provient du projet de chrome xxx


0 commentaires

0
votes

J'avais exactement le même problème, est googlé pour cela et est venu ici. Mais j'ai aussi trouvé une page utile de support Microsoft de
https://support.microsoft. com / fr-gb / help / 188768 / info-work-work-with-filétime-structure

Il dit:


arithmétique avec des temps de fichier < / strong>

Il est souvent nécessaire d'effectuer une simple arithmétique sur les temps de fichier. Par exemple, vous devrez peut-être savoir quand un fichier est de 30 jours. Pour effectuer une arithmétique sur un temps de fichier, vous devez convertir le filétime en quadwottword (un entier 64 bits), effectuer l'arithmétique, puis convertir le résultat à un filéme.

supposant que FT est une structure de filétime contenant l'heure de création d'un fichier, le code d'échantillon suivant ajoute 30 jours à l'heure: xxx


modifier: je me rends compte que cela confirme simplement une partie de la Autres réponses, mais je pensais que cela valait la peine d'être ajouté pour des éclaircissements.


0 commentaires