예제 #1
0
        private bool RecoveryFile(FNodeX source, string savePath)
        {
            var node = source.Source;
            FILE_RECOVERY_INFO file = new FILE_RECOVERY_INFO();

            file.Attr         = node.FileAttribute;
            file.FileId       = node.FileId;
            file.OffSet       = node.OffsetBytes;
            file.OffsetSec    = node.OffsetSec;
            file.ParentFileId = node.ParentFileId;
            file.Size         = node.Size;

            CHECK_SUM_INFO check = new CHECK_SUM_INFO();

            int res = 0;

            IntPtr fileHandle = IntPtr.Zero;

            try
            {
                fileHandle = FileServiceCoreDll.CreateNewFile(savePath);

                res = FileServiceCoreDll.RecoveryFile(source.Mount, fileHandle, LpfnRecoveryFileProgressEx, ref file, ref check);

                if (0 != res)
                {
                    LoggerManagerSingle.Instance.Error(string.Format("提取文件时底层库FileServiceCoreDll.RecoveryFile失败!错误码:{0}", res));
                }
            }
            catch (Exception ex)
            {
                LoggerManagerSingle.Instance.Error("提取文件时底层库FileServiceCoreDll.RecoveryFile出现异常!", ex);
            }
            finally
            {
                if (IntPtr.Zero != fileHandle)
                {
                    FileServiceCoreDll.CloseDevice(fileHandle);
                }
            }

            return(res == 0);
        }
예제 #2
0
        private byte[] ReadFileBytes(FNodeX source, int offset = 0, int len = 0)
        {
            var node = source.Source;
            FILE_RECOVERY_INFO file = new FILE_RECOVERY_INFO();

            file.Attr         = node.FileAttribute;
            file.FileId       = node.FileId;
            file.OffSet       = node.OffsetBytes;
            file.OffsetSec    = node.OffsetSec;
            file.ParentFileId = node.ParentFileId;
            file.Size         = node.Size;
            byte[] buff = new byte[len];
            try
            {
                FileServiceCoreDll.ReadFileByBottom(source.Mount, ref file, (ulong)offset, len, buff);
            }
            catch (Exception ex)
            {
                LoggerManagerSingle.Instance.Error("提取文件时底层库FileServiceCoreDll.ReadFileByBottom出现异常!", ex);
            }
            return(buff);
        }
예제 #3
0
 public static extern Int32 ReadFileByBottom(IntPtr mountHandle, ref FILE_RECOVERY_INFO recoveryFileInfo, UInt64 offset_bytes, Int32 length, byte[] buffer);
예제 #4
0
 public static extern Int32 RecoveryFile(IntPtr mountHandle, IntPtr newFileHandle, LpfnRecoveryFileProgressEx callback, ref FILE_RECOVERY_INFO recoveryFileInfo, ref CHECK_SUM_INFO cherckSumInfo);
예제 #5
0
 public static extern Int32 RecoveryFile(IntPtr mountHandle, IntPtr newFileHandle, LpfnRecoveryFileProgress callback, ref FILE_RECOVERY_INFO recoveryFileInfo);
예제 #6
0
 /// <summary>
 /// 通过底层读取文件内容
 /// </summary>
 /// <param name="mountHandle">分区句柄</param>
 /// <param name="recoveryFileInfo">文件信息结构指针</param>
 /// <param name="offset_bytes">偏移字节</param>
 /// <param name="length">读取长度</param>
 /// <param name="buffer">输出数据缓冲区指针</param>
 /// <returns>0 - 成功,其他数字-错误</returns>
 public Int32 ReadFileByBottomEx(IntPtr mountHandle, ref FILE_RECOVERY_INFO recoveryFileInfo, UInt64 offset_bytes, Int32 length, byte[] buffer)
 {
     return(ReadFileByBottom(mountHandle, ref recoveryFileInfo, offset_bytes, length, buffer));
 }
예제 #7
0
 /// <summary>
 /// 恢复文件
 /// </summary>
 /// <param name="mountHandle">装载的分区句柄</param>
 /// <param name="newFileHandle">新建文件句柄</param>
 /// <param name="callback">文件恢复进度回调函数</param>
 /// <param name="recoveryFileInfo">被恢复文件结构</param>
 /// <returns></returns>
 public Int32 RecoveryFileEx(IntPtr mountHandle, IntPtr newFileHandle, LpfnRecoveryFileProgress callback, ref FILE_RECOVERY_INFO recoveryFileInfo)
 {
     return(RecoveryFile(mountHandle, newFileHandle, callback, ref recoveryFileInfo));
 }