public IEnumerable <IFile> GetFiles() { return(Directory .GetFiles(Location) .Where(i => !FileTools.IsZip(i)) .Select(i => new FileSystemFile(i))); }
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); }
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); }
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); }