object ensureDirectoryExists(DirectoryInfo di, scanDirParams scanDirParams) { var s = Utils.BackslashAdd(di.FullName); if (scanDirParams.DirEntries.ContainsKey(s)) { return(null); } bool isRoot = (scanDirParams.SourceDirectory == s); object r; if (!isRoot) { var p = di.Parent; if (p != null) { r = ensureDirectoryExists(di.Parent, scanDirParams); if (r != null || scanDirParams.DirEntries[Utils.BackslashAdd(di.Parent.FullName)] == null) { return(r); } } } ZipFSEntry ze = null; if (isRoot) { ZipEntry zen = new ZipEntry(""); zen.ExternalFileAttributes |= 16; ze = new ZipFSEntry(zen, ZipTime); } else { ze = new ZipFSEntry(scanDirParams.EntryFactory, di, ZipTime); } r = ProcessPrepare(new FileOrDirectoryInfo(di), ze, () => { scanDirParams.DirEntries[s] = ze; return(null); }); if (r == null) { r = ProcessComplete(new FileOrDirectoryInfo(di), ze, false, skip => { scanDirParams.DirEntries[s] = skip?null:ze; if (!skip && !isRoot) { scanDirParams.Zip.PutNextEntry(isRoot?new ZipEntry(string.Empty):scanDirParams.EntryFactory.MakeDirectoryEntry(s)); } return(null); }); } return(r); }
object scanDir(string directory, scanDirParams scanDirParams) { directory = Utils.BackslashAdd(directory); bool isRoot = (scanDirParams.SourceDirectory == directory); DirectoryInfo di = new DirectoryInfo(directory); if (!CheckHidden(di) && !isRoot) { return(null); } bool processFiles = true; if (!scanDirParams.DirFilter.IsMatch(directory)) { processFiles = false; VerboseMessage("{0} did not pass directory filter", directory); } // Process files in this directory if (processFiles) { foreach (FileInfo f in di.GetFiles()) { object r = compressSingleFile(f, scanDirParams); if (r != null) { return(r); } } if (EmptyDirectories) { object r = ensureDirectoryExists(di, scanDirParams); if (r != null) { return(r); } } } if (Recursive) { foreach (DirectoryInfo d in di.GetDirectories()) { object r = scanDir(d.FullName, scanDirParams); if (r != null) { return(r); } } } return(null); }
object compressSingleFile(FileInfo fi, scanDirParams scanDirParams) { if (!CheckHidden(fi) || !scanDirParams.NameFilter.IsMatch(fi.FullName)) { return(null); } object r = ensureDirectoryExists(fi.Directory, scanDirParams); if (r != null || scanDirParams.DirEntries[Utils.BackslashAdd(fi.Directory.FullName)] == null) { return(r); } var ze = new ZipFSEntry(scanDirParams.EntryFactory, fi, ZipTime); r = ProcessPrepare(new FileOrDirectoryInfo(fi), ze, () => null); if (r != null) { return(r); } r = ProcessComplete(new FileOrDirectoryInfo(fi), ze, false, skip2 => { if (!skip2) { using (Stream stream = Context.OpenStream(fi.FullName)) { ZipEntry zentry = scanDirParams.EntryFactory.MakeFileEntry(fi.FullName); scanDirParams.Zip.PutNextEntry(zentry); StreamUtils.Copy(stream, scanDirParams.Zip, scanDirParams.Buffer, scanDirParams.Progress, ProgressInterval, this, fi.FullName); } } return(null); }); return(r); }
object scanDir(string directory, scanDirParams scanDirParams) { directory = Utils.BackslashAdd(directory); bool isRoot = (scanDirParams.SourceDirectory == directory); DirectoryInfo di = new DirectoryInfo(directory); if (!CheckHidden(di) && !isRoot) return null; bool processFiles = true; if (!scanDirParams.DirFilter.IsMatch(directory)) { processFiles = false; VerboseMessage("{0} did not pass directory filter", directory); } // Process files in this directory if (processFiles) { foreach (FileInfo f in di.GetFiles()) { object r = compressSingleFile(f,scanDirParams); if (r != null) return r; } if (EmptyDirectories) { object r = ensureDirectoryExists(di, scanDirParams); if (r != null) return r; } } if (Recursive) { foreach (DirectoryInfo d in di.GetDirectories()) { object r = scanDir(d.FullName, scanDirParams); if (r != null) return r; } } return null; }
object ensureDirectoryExists(DirectoryInfo di, scanDirParams scanDirParams) { var s = Utils.BackslashAdd( di.FullName); if (scanDirParams.DirEntries.ContainsKey(s)) return null; bool isRoot = (scanDirParams.SourceDirectory == s); object r; if (!isRoot) { var p = di.Parent; if (p != null) { r = ensureDirectoryExists(di.Parent, scanDirParams); if (r != null || scanDirParams.DirEntries[Utils.BackslashAdd(di.Parent.FullName)] == null) return r; } } ZipFSEntry ze = null; if (isRoot) { ZipEntry zen = new ZipEntry(""); zen.ExternalFileAttributes |= 16; ze = new ZipFSEntry(zen, ZipTime); } else ze = new ZipFSEntry(scanDirParams.EntryFactory, di, ZipTime); r=ProcessPrepare(new FileOrDirectoryInfo(di), ze, () => { scanDirParams.DirEntries[s] = ze; return null; }); if (r == null) r = ProcessComplete(new FileOrDirectoryInfo(di), ze, false, skip => { scanDirParams.DirEntries[s] = skip?null:ze; if (!skip && !isRoot) scanDirParams.Zip.PutNextEntry(isRoot?new ZipEntry(string.Empty):scanDirParams.EntryFactory.MakeDirectoryEntry(s)); return null; }); return r; }
object compressSingleFile(FileInfo fi, scanDirParams scanDirParams) { if (!CheckHidden(fi) || !scanDirParams.NameFilter.IsMatch(fi.FullName)) return null; object r=ensureDirectoryExists(fi.Directory, scanDirParams); if (r != null || scanDirParams.DirEntries[Utils.BackslashAdd(fi.Directory.FullName)] == null) return r; var ze=new ZipFSEntry(scanDirParams.EntryFactory, fi, ZipTime); r = ProcessPrepare(new FileOrDirectoryInfo(fi), ze, () => null); if (r != null) return r; r = ProcessComplete(new FileOrDirectoryInfo(fi), ze, false, skip2 => { if (!skip2) { using (Stream stream = Context.OpenStream(fi.FullName)) { ZipEntry zentry = scanDirParams.EntryFactory.MakeFileEntry(fi.FullName); scanDirParams.Zip.PutNextEntry(zentry); StreamUtils.Copy(stream, scanDirParams.Zip, scanDirParams.Buffer, scanDirParams.Progress, ProgressInterval, this, fi.FullName); } } return null; }); return r; }