예제 #1
0
파일: IO.cs 프로젝트: gtrant/eraser
        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);
            }
        }
예제 #2
0
파일: IO.cs 프로젝트: gtrant/eraser
        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);
            }
        }