2つのsystem.runtime.interopservices.comtypes.filetimeオブジェクトを差し引く最も安全な方法は何ですか
-
11-10-2019 - |
質問
2つを差し引くための最も安全な方法は何だろうか System.Runtime.InteropServices.ComTypes.FILETIME
オブジェクト?次のコードを使用しましたが、32ビット値が低いため、算術オーバーフローの例外が得られる場合があります。体を囲むかどうかはわかりません 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;
}
解決
使用する必要があります チェックされていない 例外を抑制するには:
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に変換できます。
他のヒント
FileTimeを使用してDateTimeオブジェクトに変換できます datetime.fromfiletime() メソッドでは、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 );
}
}
所属していません StackOverflow