private FsNode <FileInfo> GetFileInfo(string fileName, FileInfo prefileinfo = null) { logger.Debug(Thread.CurrentThread.ManagedThreadId + " GetFileInfo: " + fileName); var lowerfilename = fileName.ToLower(); // check extension first, then if it exists if (lowerfilename.EndsWith(".rar") || lowerfilename.EndsWith(".zip") || (lowerfilename.Contains(".rar") || lowerfilename.Contains(".zip")) && !File.Exists(fileName) && !Directory.Exists(fileName)) { if (fileName.ToLower().Contains(".rar") || fileName.ToLower().Contains(".zip")) { try { var info2 = new FileInfo(fileName); var index = fileName.ToLower().IndexOf(".rar"); if (index == -1) { index = fileName.ToLower().IndexOf(".zip"); } var file = fileName.Substring(0, index + 4); var subpath = fileName.Substring(index + 4); SharpCompressFs fs = null; cache.TryGetValue(file.ToLower(), out fs); if (fs == null) { logger.Debug("SevenZipFs: get list " + file); try { fs = new SharpCompressFs(file); } catch { return(null); } } cache[file.ToLower()] = fs; var fsnodeinfo = fs.GetFile(subpath); if (fsnodeinfo == null) { return(null); } var answerarchive = new FsNode <FileInfo>() { Tag = fsnodeinfo, Info = info2, Name = info2.Name, FullName = info2.FullName }; answerarchive.GetChildrenDelegate = () => { answerarchive.Tag = fsnodeinfo; return(fsnodeinfo?.Children? .Select(x => GetFileInfo(( file + Path.DirectorySeparatorChar + subpath + Path.DirectorySeparatorChar + x).Replace("" + Path.DirectorySeparatorChar + Path.DirectorySeparatorChar, "" + Path.DirectorySeparatorChar)))?.Where(a => a != null).ToList()); }; return(answerarchive); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(ex); Console.ForegroundColor = ConsoleColor.White; return(null); } } return(null); } FileInfo info; if (prefileinfo != null) { info = prefileinfo; } else { info = new FileInfo(fileName); } var answer = new FsNode <FileInfo>() { Info = info, Name = info.Name, FullName = info.FullName, GetChildrenDelegate = () => { DirectoryInfo dirinfo = new DirectoryInfo(info.FullName); if (dirinfo.Exists) { try { // get dirs var dirs = new ConcurrentBag <FsNode <FileInfo> >(); Parallel.ForEach(dirinfo.GetDirectories("*", SearchOption.TopDirectoryOnly), x => { if (CheckHasValidChildren(x, "*.rar")) { dirs.Add(GetFileInfo(x.FullName)); } }); // get files var files = new ConcurrentBag <FsNode <FileInfo> >(); var fileInfos = dirinfo.GetFiles("*.rar", SearchOption.TopDirectoryOnly); Parallel.ForEach(fileInfos, x => { files.Add(GetFileInfo(x.FullName, x)); }); // filter files var filefilter = files.Where(a => a != null && (a.Name.ToLower().Contains("part01.rar") || !a.Name.ToLower().Contains(".part"))); // combine to one list var combined = filefilter.Concat(dirs).Where(a => a != null); // return result return(combined.ToList()); } catch (Exception ex) { logger.Error(ex.ToString()); return(null); } } return(null); } }; return(answer); }