Ce qui est le plus sûr moyen de soustraire deux objets System.Runtime.InteropServices.ComTypes.FILETIME
-
11-10-2019 - |
Question
Je me demande ce qui est le plus sûr moyen de soustraire deux objets System.Runtime.InteropServices.ComTypes.FILETIME
? J'ai utilisé le code suivant mais parfois ça me fait exception ArithmaticOverflow en raison du nombre de négatif dans les faibles valeurs 32 bits. Je ne suis pas sûr que le corps joins avec unchecked
servira le but ou non. S'il vous plaît me donner quelques suggestions sur la façon de le faire en toute sécurité sans avoir aucune exception d'exécution ou d'un message d'avertissement CS0675.
private static UInt64 SubtractTimes(FILETIME a, FILETIME b)
{
UInt64 aInt = ((UInt64)(a.dwHighDateTime << 32)) | (UInt32)a.dwLowDateTime;
UInt64 bInt = ((UInt64)(b.dwHighDateTime << 32)) | (UInt32)b.dwLowDateTime;
return aInt - bInt;
}
La solution
Vous devez utiliser décochée pour supprimer l'exception:
public static long FileTime2Long(FILETIME ft) {
uint low = unchecked((uint)ft.dwLowDateTime);
return (long)ft.dwHighDateTime << 32 | low;
}
static void Test() {
FILETIME ft = new FILETIME();
ft.dwHighDateTime = 1;
ft.dwLowDateTime = -1;
long value = FileTime2Long(ft);
Debug.Assert(value == 0x1ffffffff);
}
Si vous le souhaitez, vous pouvez ensuite convertir en DateTime avec DateTime.FromFileTimeUtc ().
Autres conseils
Vous pouvez convertir FILETIME à DateTime objet en utilisant DateTime.FromFileTime () méthode et vous pouvez en toute sécurité les objets DateTime substract.
Si vous avez un même problème utilisez la méthode ci-dessous parce que DateTime.FromFileTime () ne fonctionne pas dans tous les cas, grâce à des émissions signés / non signés.
public static DateTime ToDateTime( System.Runtime.InteropServices.FILETIME ft )
{
IntPtr buf = IntPtr.Zero;
try
{
long[] longArray = new long[1];
int cb = Marshal.SizeOf( ft );
buf = Marshal.AllocHGlobal( cb );
Marshal.StructureToPtr( ft, buf, false );
Marshal.Copy( buf, longArray, 0, 1 );
return DateTime.FromFileTime( longArray[0] );
}
finally
{
if ( buf != IntPtr.Zero ) Marshal.FreeHGlobal( buf );
}
}