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