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); }
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); }
public static extern Int32 ReadFileByBottom(IntPtr mountHandle, ref FILE_RECOVERY_INFO recoveryFileInfo, UInt64 offset_bytes, Int32 length, byte[] buffer);
public static extern Int32 RecoveryFile(IntPtr mountHandle, IntPtr newFileHandle, LpfnRecoveryFileProgressEx callback, ref FILE_RECOVERY_INFO recoveryFileInfo, ref CHECK_SUM_INFO cherckSumInfo);
public static extern Int32 RecoveryFile(IntPtr mountHandle, IntPtr newFileHandle, LpfnRecoveryFileProgress callback, ref FILE_RECOVERY_INFO recoveryFileInfo);
/// <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)); }
/// <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)); }