/// <summary>
        /// 加载即时通讯信息;
        /// </summary>
        /// <param name="advCFile"></param>
        /// <param name="infoKind"></param>
        public static void LoadInstanceChat(AndroidDeviceCaseEvidence advCFile, string pinKind)
        {
            //保存内容到案件;
            var fiUnit = ServiceProvider.Current.GetInstance <ICommonForensicService>().GetForensicInfoUnit(advCFile);

            if (fiUnit == null)
            {
                return;
            }

            var afcUnit = fiUnit.Children.
                          FirstOrDefault(p => p is PinTreeUnit fcUnit && fcUnit.ContentId == PinKindsDefinitions.ForensicClassInstantTalk) as PinTreeUnit;

            if (afcUnit == null)
            {
                return;
            }

            PinTreeUnit chatUnit = null;

            if (afcUnit.Children.FirstOrDefault(p => p is PinTreeUnit oTreeUnit && oTreeUnit.ContentId == pinKind)
                is PinTreeUnit preChatUnit)
            {
                chatUnit = preChatUnit;
            }
        /// <summary>
        /// 加载现有基本信息(Contact+sms);
        /// </summary>
        /// <param name="advCFile"></param>
        /// <param name="binPath"></param>
        /// <param name="pinKind"></param>
        public static void LoadBasicInfo(AndroidDeviceCaseEvidence advCFile, string pinKind)
        {
            var fiUnit = ServiceProvider.Current.GetInstance <ICommonForensicService>().GetForensicInfoUnit(advCFile);

            if (fiUnit == null)
            {
                return;
            }
            var csService = ServiceProvider.Current.GetInstance <ICaseService>();

            if (csService == null)
            {
                Logger.WriteCallerLine($"{nameof(ICaseService)} is not registered.");
                return;
            }

            if (fiUnit.Children.FirstOrDefault(p => p is IHavePinKind havePin && havePin.ContentId == pinKind) is ITreeUnit preUnit)
            {
                fiUnit.Children.Remove(preUnit);
                //var fsTabService = ServiceProvider.Current.GetInstance<FSTabService>();
            }

            TreeUnit newUnit = null;

            try {
                using (var fs = File.OpenRead($"{csService.CurrentCase.Path}/{advCFile.BasePath}/{advCFile[pinKind]}")) {
                    var bf       = new BinaryFormatter();
                    var dbModels = (List <ForensicInfoDbModel>)bf.Deserialize(fs);
                    //显示;
                    if (pinKind == PinKindsDefinitions.AndBasicCalllog)
                    {
                        newUnit = new MultiDbModelsUnit <CalllogDbModel>(dbModels?.Select(p => p as CalllogDbModel).ToList(), pinKind, fiUnit);
                    }
                    else if (pinKind == PinKindsDefinitions.AndBasicSmses)
                    {
                        newUnit = new MultiDbModelsUnit <SmsDbModel>(
                            dbModels?.Select(p => p as SmsDbModel).ToList(),
                            PinKindsDefinitions.AndBasicSmses,
                            fiUnit,
                            sms => (sms.relationship_account, sms.relationship_name));
                    }
                    else if (pinKind == PinKindsDefinitions.AndBasicContact)
                    {
                        newUnit = new MultiDbModelsUnit <ContactDbModel>(dbModels?.Select(p => p as ContactDbModel).ToList(), pinKind, fiUnit);
                    }
                    if (newUnit != null)
                    {
                        newUnit.Label = $"{FindResourceString(pinKind)}({dbModels?.Count ?? 0})";
                        fiUnit.Children.Add(newUnit);
                    }
                }
            }
            catch (Exception ex) {
                EventLogger.Logger.WriteCallerLine(ex.Message);
            }
        }
        /// <summary>
        /// //调用py;获得结果参数文件路径;
        /// </summary>
        /// <param name="outPutXDocPath">输出参数文件路径</param>
        /// <param name="pyName"></param>
        /// <returns>输出相对路径以及参数文件的路径</returns>
        public static (string outPutPath, string outDocName) GetProcessOutPut(AndroidDeviceCaseEvidence CaseFile, string pyName)
        {
            var csService = ServiceProvider.Current?.GetInstance <ICaseService>();

            if (csService == null)
            {
                throw new InvalidOperationException($"{nameof(ICaseService)} is not registered.");
            }

            var guid          = Guid.NewGuid().ToString("N");
            var outPutPath    = $"{csService.CurrentCase.Path}/{CaseFile.BasePath}/{guid}";
            var outPutDocName = "output.xml";

            if (!System.IO.Directory.Exists(outPutPath))
            {
                System.IO.Directory.CreateDirectory(outPutPath);
            }

            //生成参数文件;
            var xDoc = new XDocument();

            //文件范围相关;
            var rootElem       = new XElement("Params");
            var rangesXDoc     = CaseFile.BuildFilesDoc(saveAllFiles: false);
            var FileRangesXDoc = $"{outPutPath}/new.xml";
            var outPutXDocPath = $"{outPutPath}/{outPutDocName}";

            rangesXDoc.Save(FileRangesXDoc);

            //其它参数;
            rootElem.Add(new XElement("GUID", guid));
            rootElem.Add(new XElement("type", "SingleImg"));
            rootElem.Add(new XElement("ImgPath", CaseFile.InterLabel));
            rootElem.Add(new XElement(nameof(FileRangesXDoc), FileRangesXDoc));
            rootElem.Add(new XElement("OutPutXDocPath", outPutXDocPath));
            rootElem.Add(new XElement("OutPutPath", outPutPath));
            xDoc.Add(rootElem);

            //流输入控制;
            StreamWriter iw = null;

            try {
                var argPath = $"{outPutPath}/read.xml";
                xDoc.Save(argPath);
                var parser = PythonHelper.GetProcess(pyName, argPath);
                parser.OutputDataReceived += (sender, e) => {
                    //确定是否是请求文件;
                    if (e.Data?.StartsWith(request_file) == true)
                    {
#if DEBUG
                        Console.WriteLine("Request:" + e.Data);
#endif
                        //获得文件相对于设备本身的路径;
                        var requestFile = e.Data.Substring(request_file.Length + 1);
                        var requestPath = requestFile.Substring(0, requestFile.LastIndexOf("/"));
                        var file        = CaseFile.Data.GetFileByUrl(requestFile);
                        if (file is RegularFile regFile)
                        {
                            using (var stream = regFile.GetStream()) {
                                Stream targetStream = null;
                                try {
                                    if (!System.IO.Directory.Exists($"{outPutPath}/{requestPath}"))
                                    {
                                        System.IO.Directory.CreateDirectory($"{outPutPath}/{requestPath}");
                                    }
                                    targetStream = File.Create($"{outPutPath}/{requestFile}");
                                    stream.CopyTo(targetStream);
                                    targetStream.Close();
                                    iw.WriteLine("True");
                                }
                                catch {
                                    iw.WriteLine("False");
                                }
                            }
                        }
                        else
                        {
                            Logger.WriteCallerLine($"Error:Invalid file type:{e.Data}");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Unknown output:" + e.Data);
                    }
                };
                parser.ErrorDataReceived += (sender, e) => {
                    Logger.WriteLine($"{nameof(AdvPythonHelper)}->{nameof(GetProcessOutPut)}:{e.Data}");
#if DEBUG
                    Console.WriteLine(e.Data);
#endif
                };
                parser.Start();

                //重定向相关;
                parser.BeginOutputReadLine();
                parser.BeginErrorReadLine();

                iw = parser.StandardInput;

                parser.WaitForExit();
                parser.Dispose();

                return(outPutPath, outPutDocName);
            }
            catch (Exception ex) {
                Logger.WriteLine($"{nameof(AdvPythonHelper)}->{nameof(GetProcessOutPut)}:{ex.Message}");
                throw;
            }
        }