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;
        }
Était-ce utile?

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 );
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top