/// <summary> /// 分层扫描接口 扫描文件夹 /// </summary> /// <param name="partition">分区</param> /// <returns></returns> public List <FNodeX> GetFileSystemByDir(FNodeX pNode) { LINK_DIR_FILE_NODE_INFO link = new LINK_DIR_FILE_NODE_INFO(); var result = FileServiceCoreDll.ScanFilesByDir(pNode.Mount, GetFileSystemByDirScanCallBack, pNode.Key, ref link); if (0 != result) { } // 加载树结构; var source = BuildDataDictionary(link); BuildTree(pNode, source); return(pNode.Collection); }
/// <summary> /// 创建数据字典 /// </summary> /// <param name="linkInfo"></param> /// <returns></returns> public Dictionary <ulong, ICollection <FNodeX> > BuildDataDictionary(LINK_DIR_FILE_NODE_INFO linkInfo) { var data = new Dictionary <ulong, ICollection <FNodeX> >(); while (linkInfo.next != IntPtr.Zero) { linkInfo = linkInfo.next.ToStruct <LINK_DIR_FILE_NODE_INFO>(); if (linkInfo.NodeDataInfo.FileId == linkInfo.NodeDataInfo.ParentFileId) { continue; } ulong parentId = linkInfo.NodeDataInfo.ParentFileId; FNodeX file = BuildFileXNode(linkInfo.NodeDataInfo); if (data.ContainsKey(parentId)) { if (!file.IsDelete) { data[parentId].Add(file); } } else { data.Add(parentId, new Collection <FNodeX> { file }); } if (RunPartition.VolName != null && RunPartition.VolName.Equals("userdata", StringComparison.OrdinalIgnoreCase)) { GetUserPartitionFiles.Add(file); } AllFileNodeX.Add(file); } foreach (var nfid in _delFolderIdSet) { if (_normalFolderIdSet.Contains(nfid)) { _problemFolderIdSet.Add(nfid); } } return(data); }
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); }
/// <summary> /// 分层扫描接口 扫描分区 /// </summary> /// <param name="partition">分区</param> /// <returns></returns> public List <FNodeX> GetFileSystemByDir(FileSystemPartition partition) { RunPartition = partition; MountDevice(); VOL_BPB_INFO vol = new VOL_BPB_INFO(); var result = FileServiceCoreDll.GetPartInfo(partition.Mount, ref vol); if (0 != result) { } LINK_DIR_FILE_NODE_INFO link = new LINK_DIR_FILE_NODE_INFO(); result = FileServiceCoreDll.ScanFilesByDir(partition.Mount, GetFileSystemByDirScanCallBack, vol.root_ino, ref link); if (0 != result) { } // 构建当前分区节点 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.Collection); }
public static extern Int32 DisposeLinkTableRoom(IntPtr mountHandle, ref LINK_DIR_FILE_NODE_INFO fileLinks);
public static extern Int32 ScanFilesByDir(IntPtr mountHandle, ScanCallBack lpfnprgs, UInt64 ino, ref LINK_DIR_FILE_NODE_INFO fileLinks);
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="fileLinks">底层可返回的文件链对象</param> public Int32 DisposeLinkTableRoomEx(IntPtr mountHandle, ref LINK_DIR_FILE_NODE_INFO fileLinks) { return(DisposeLinkTableRoom(mountHandle, ref fileLinks)); }
/// <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)); }