2

System.Runtime.InteropServices.ComTypes.FILETIME2 つのオブジェクトを減算する最も安全な方法は何だろうか? 次のコードを使用しましたが、下位 32 ビット値の負の数が原因で ArithmaticOverflow 例外が発生することがあります。体を囲むuncheckedことが目的に役立つかどうかはわかりません。実行時例外や 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;
        }
4

2 に答える 2

1

例外を抑制するには、uncheckedを使用する必要があります。

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

必要に応じて、DateTime.FromFileTimeUtc() を使用して DateTime に変換できます。

于 2011-01-16T19:47:23.077 に答える
0

DateTime.FromFileTime()メソッドを使用して FILETIME を DateTime オブジェクトに変換すると、DateTime オブジェクトを安全に差し引くことができます。

同じ問題が発生する場合は、以下の方法を使用してください。これは、署名付き/未署名の問題により、 DateTime.FromFileTime()がすべての場合に機能するとは限らないためです。

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 );
  }
}
于 2011-01-16T19:36:34.503 に答える