Exemple #1
0
        /// <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);
        }
Exemple #4
0
        /// <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);
Exemple #8
0
 /// <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));
 }
Exemple #9
0
 /// <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));
 }