private static DateTime GetUpdateTime(SafeFileHandle handle) { NativeMethods.FILE_BASIC_INFORMATION fileInfo = new NativeMethods.FILE_BASIC_INFORMATION(); IntPtr fileInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(fileInfo)); try { NativeMethods.IO_STATUS_BLOCK status; uint result = NativeMethods.NtQueryInformationFile(handle, out status, fileInfoPtr, (uint)Marshal.SizeOf(fileInfo), NativeMethods.FILE_INFORMATION_CLASS.FileBasicInformation); if (result != 0) { throw new IOException(); } fileInfo = (NativeMethods.FILE_BASIC_INFORMATION) Marshal.PtrToStructure(fileInfoPtr, fileInfo.GetType()); return(DateTime.FromFileTime(fileInfo.ChangeTime)); } finally { Marshal.FreeHGlobal(fileInfoPtr); } }
internal static void SetTimes(SafeFileHandle handle, DateTime updateTime, DateTime createdTime, DateTime lastModifiedTime, DateTime lastAccessedTime) { NativeMethods.FILE_BASIC_INFORMATION fileInfo = new NativeMethods.FILE_BASIC_INFORMATION() { ChangeTime = updateTime.ToFileTime(), CreationTime = createdTime.ToFileTime(), LastAccessTime = lastAccessedTime.ToFileTime(), LastWriteTime = lastModifiedTime.ToFileTime() }; if (fileInfo.ChangeTime == 0) { throw new ArgumentOutOfRangeException("updateTime"); } if (fileInfo.CreationTime == 0) { throw new ArgumentOutOfRangeException("createdTime"); } if (fileInfo.LastAccessTime == 0) { throw new ArgumentOutOfRangeException("lastAccessedTime"); } if (fileInfo.LastWriteTime == 0) { throw new ArgumentOutOfRangeException("lastModifiedTime"); } IntPtr fileInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(fileInfo)); try { Marshal.StructureToPtr(fileInfo, fileInfoPtr, true); NativeMethods.IO_STATUS_BLOCK status; uint result = NativeMethods.NtSetInformationFile(handle, out status, fileInfoPtr, (uint)Marshal.SizeOf(fileInfo), NativeMethods.FILE_INFORMATION_CLASS.FileBasicInformation); if (result != 0) { throw new IOException(); } } finally { Marshal.FreeHGlobal(fileInfoPtr); } }