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);
        }
示例#3
0
 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);
示例#4
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));
 }