Frage

Ich frage mich, was der sicherste Weg ist, zwei System.Runtime.InteropServices.ComTypes.FILETIME Objekte zu subtrahieren? Ich habe den folgenden Code, aber manchmal gibt es mir ArithmaticOverflow Ausnahme aufgrund der negativen Zahl in Low 32-Bit-Werten. Ich bin nicht sicher, umschließt der Körper mit unchecked wird dem Zweck dienen oder nicht. Bitte geben Sie mir einige Vorschläge, wie es sicher zu tun, ohne eine Laufzeitausnahme oder CS0675 Warnmeldung zu erhalten.

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;
        }
War es hilfreich?

Lösung

Sie müssen verwenden nicht markiert die Ausnahme zu unterdrücken:

    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);
    }

Falls gewünscht, können Sie dann mit DateTime.FromFileTimeUtc konvertieren Datetime ().

Andere Tipps

Sie können FILE zu Datetime-Objekt konvertieren, indem Sie DateTime.FromFileTime () Methode und dann können Sie sicher subtrahieren Datetime-Objekte.

Wenn Sie ein gleiches Problem haben dann verwenden Methode unten, weil DateTime.FromFileTime () funktioniert nicht in allen Fällen dank signed / unsigned Themen.

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 );
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top