private LIST_FILE_RAW_TYPE_INFO CreatRawLink() { if (_listRawTypeInfos == null) { _listRawTypeInfos = new List <LIST_FILE_RAW_TYPE_INFO>(); try { StringBuilder sb = new StringBuilder(); sb.AppendFormat("select * from FileClass where 1 <> 1 "); RAW_TYPES.ForEach(s => sb.AppendFormat(" or FileType = {0} ", s)); SqliteContext sql = new SqliteContext(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileRawTypeLib.db")); DataTable dt = sql.FindDataTable(sb.ToString()); IntPtr lastPtr = IntPtr.Zero; foreach (DataRow dr in dt.Rows) { FILE_RAW_TYPE_INFO raw = new FILE_RAW_TYPE_INFO(); raw.FileType = dr["FileExName"].ToSafeString().Replace(";", "_"); //dr["FileTypeName"].ToSafeString(); raw.Size = dr["FileDefaultSize"].ToSafeString().ToSafeInt(); raw.ExtensionName = dr["FileExName"].ToSafeString(); raw.HeadMagic = dr["FileHeadFlag"].ToSafeString(); raw.HeadOffsetBytes = (ushort)dr["FileHeadBeginPos"].ToSafeString().ToSafeInt(); raw.FootMagic = dr["FileEndFlag"].ToSafeString(); raw.FootOffsetBytes = dr["FileEndPOS"].ToSafeString().ToSafeInt(); raw.HeadLen = dr["FileHeadLength"].ToSafeString().ToSafeInt(); raw.FootLen = 0; LIST_FILE_RAW_TYPE_INFO rawlist = new LIST_FILE_RAW_TYPE_INFO(); rawlist.Check = 1; //0 - 不检查, 1 - 检查 rawlist.Num = 0; rawlist.rt = raw; rawlist.next = lastPtr; int size = Marshal.SizeOf(rawlist); IntPtr rawptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(rawlist, rawptr, true); _listRawTypeInfos.Add(rawlist); lastPtr = rawptr; } } catch (Exception ex) { LoggerManagerSingle.Instance.Error("获取Raw文件类型失败!", ex); } } return(_listRawTypeInfos.Count > 0 ? _listRawTypeInfos[_listRawTypeInfos.Count - 1] : new LIST_FILE_RAW_TYPE_INFO()); }
private FNodeX ScanFileSystem(IFileSystemDevice device, FileSystemPartition partition) { ScanCallBack callBack = (ref ScanCallBackData pdi) => { }; LINK_DIR_FILE_NODE_INFO link = new LINK_DIR_FILE_NODE_INFO(); LIST_FILE_RAW_TYPE_INFO raw = CreatRawLink(); try { var result = FileServiceCoreDll.ScanFiles(partition.Mount, callBack, ref link, device.ScanModel, ref raw, 0); if (result != 0) { LoggerManagerSingle.Instance.Error(string.Format("获取文件系统(名称:{ 0},描述: { 1},大小: { 2})失败,错误码: { 3}", partition.Name, partition.Discription, partition.Size, result)); return(null); } partition.NodeLinkList = link; } catch (Exception ex) { LoggerManagerSingle.Instance.Error(string.Format("获取文件系统(名称:{0},描述:{1},大小:{2},Mount:{3})时底层dll出错", partition.Name, partition.Discription, partition.Size, partition.Mount), ex); return(null); } // 构建当前分区节点 var treeNode = new FNodeX { Source = link.NodeDataInfo, FileName = partition.VolName, IsRoot = true, IsPartition = true, Key = link.NodeDataInfo.FileId, ParentKey = link.NodeDataInfo.ParentFileId }; // 加载树结构; var source = BuildDataDictionary(link); BuildTree(treeNode, source); return(treeNode); }
public static extern Int32 ScanFiles(IntPtr mountHandle, ScanCallBack lpfnprgs, ref LINK_DIR_FILE_NODE_INFO fileLinks, byte scanModel, ref LIST_FILE_RAW_TYPE_INFO rawList, int SnapFlag);
/// <summary> /// 许工底层从磁盘中扫描文件 /// </summary> /// <param name="mountHandle">分区mount成功后返回的句柄</param> /// <param name="lpfnprgs">扫描过程中回调函数句柄</param> /// <param name="fileLinks">底层可返回的文件链对象</param> /// <param name="scanModel">底层扫描模式(快速、Raw..)</param> /// <param name="rawList">Raw结构链</param> /// <param name="SnapFlag">创建快照标志: 0 - 不保存, 1 - 保存</param> /// <returns>返回成功与否的标识,0 -> Success</returns> public Int32 ScanFilesEx(IntPtr mountHandle, ScanCallBack lpfnprgs, ref LINK_DIR_FILE_NODE_INFO fileLinks, byte scanModel, ref LIST_FILE_RAW_TYPE_INFO rawList, bool SnapFlag) { return(ScanFiles(mountHandle, lpfnprgs, ref fileLinks, scanModel, ref rawList, SnapFlag)); }