예제 #1
0
 public IEnumerable <IFile> GetFiles()
 {
     return(Directory
            .GetFiles(Location)
            .Where(i => !FileTools.IsZip(i))
            .Select(i => new FileSystemFile(i)));
 }
예제 #2
0
        private IFolder BuildTree(IEnumerable <ZipArchiveEntry> entries)
        {
            /*
             *  1/
             *  1/11.txt
             *  2/
             *  2/2.txt
             *  2/2.2/2.2.txt
             *  inner.zip
             */

            var tree = new ZipEntryFolder(Name);

            foreach (var entry in entries)
            {
                var owner = tree;
                var path  = entry.FullName.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

                for (var i = 0; i < path.Length - 1; i++)
                {
                    var pathItem = path[i];
                    if (!owner.FolderByName.TryGetValue(pathItem, out var next))
                    {
                        next = new ZipEntryFolder(pathItem);
                        owner.FolderByName.Add(pathItem, next);
                    }

                    owner = (ZipEntryFolder)next;
                }

                var entryName = path.Last();
                if (entry.FullName.EndsWith("/"))
                {
                    if (!owner.FolderByName.ContainsKey(entryName))
                    {
                        owner.FolderByName.Add(entryName, new ZipEntryFolder(entryName));
                    }
                }
                else if (FileTools.IsZip(entry.FullName))
                {
                    owner.FolderByName.Add(entryName, new ZipFolder(this, entry.FullName));
                }
                else
                {
                    owner.Files.Add(new ZipFolderFile(this, entry.FullName));
                }
            }

            return(tree);
        }
예제 #3
0
        private static IFolder TryToResolveEntryPoint(string path)
        {
            if (Directory.Exists(path))
            {
                return(new FileSystemFolder(path));
            }

            if (File.Exists(path))
            {
                if (!FileTools.IsZip(path))
                {
                    throw new NotSupportedException("File format [{0}] is not supported as .zip container.".FormatWith(Path.GetExtension(path)));
                }

                return(new ZipFolder(path));
            }

            return(null);
        }
예제 #4
0
        public static IFileSystemInfo FileSystemInfoFromPath(string path)
        {
            path = FileTools.RootPath(path);

            if (File.Exists(path))
            {
                return(FileTools.IsZip(path) ? (IFileSystemInfo) new ZipFolder(path) : new FileSystemFile(path));
            }

            if (Directory.Exists(path))
            {
                return(new FileSystemFolder(path));
            }

            IFolder entryPoint = null;
            var     items      = new List <string>();

            while (!string.IsNullOrEmpty(path))
            {
                entryPoint = TryToResolveEntryPoint(path);
                if (entryPoint != null)
                {
                    break;
                }

                items.Insert(0, Path.GetFileName(path));
                path = Path.GetDirectoryName(path);
            }

            if (entryPoint == null)
            {
                throw new IOException("Directory {0} not found.".FormatWith(path));
            }

            for (var i = 0; i < items.Count - 1; i++)
            {
                var name = items[i];
                path = Path.Combine(path, name);

                entryPoint = entryPoint.GetFolders().FirstOrDefault(f => name.Equals(f.Name, StringComparison.OrdinalIgnoreCase));
                if (entryPoint == null)
                {
                    throw new IOException("Directory {0} not found.".FormatWith(path));
                }
            }

            var resultName = items.Last();

            path = Path.Combine(path, resultName);

            var file = entryPoint.GetFiles().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase));

            if (file != null)
            {
                return(file);
            }

            var folder = entryPoint.GetFolders().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase));

            if (folder == null)
            {
                throw new IOException("File or folder {0} not found.".FormatWith(path));
            }

            return(folder);
        }