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); }
object extract(ZipFile zip, string rootDirectory, string targetName, ZipEntry entry, Dictionary <string, bool> dirs) { string dirName; if (UsePath) { dirName = (entry.IsFile) ? Path.GetDirectoryName(Path.GetFullPath(targetName)) : targetName; } else { dirName = rootDirectory; } // Get date time from entry DateTime?entryTimeUtc = getEntryTimeUtc(entry); // Create directory bool skip = false; string zipDirName = string.Empty; ZipEntry dirZipEntry = null; if (entry.IsFile) { zipDirName = Path.GetDirectoryName(entry.Name); dirZipEntry = zip.GetEntry(zipDirName); if (dirZipEntry == null) { dirZipEntry = zip.GetEntry(zipDirName + "/"); } } else { zipDirName = entry.Name; dirZipEntry = entry; } if (dirs.TryGetValue(zipDirName, out skip) && skip) { return(null); } if (entry.IsDirectory) { DirectoryInfo dir = new DirectoryInfo(dirName); var zz = new ZipFSEntry(entry, ZipTime); var to = new FileOrDirectoryInfo(dir); object r = ProcessPrepare(zz, to, () => null); if (r == null) { r = ProcessComplete(new ZipFSEntry(entry, ZipTime), new FileOrDirectoryInfo(dir), skip, skp => { dirs[zipDirName] = skip = skp; if (Extract && !skp) { DirectoryInfo di = Directory.CreateDirectory(dirName); setAttributes(di, entry); } return(null); }); } if (r != null || skip) { return(r); } } if (entry.IsFile) { var pfrom = new ZipFSEntry(entry, ZipTime); var fi = new FileInfo(targetName); var pto = new FileOrDirectoryInfo(fi); if (fi.Exists) { if (Overwrite == OverwriteMode.Never) { skip = true; } if (Overwrite == OverwriteMode.IfNewer) { if (entryTimeUtc == null || entryTimeUtc <= File.GetLastWriteTimeUtc(targetName)) { VerboseMessage("Ignoring never file {0}", targetName); skip = true; } } } if ((skip && Overwrite != OverwriteMode.Confirm)) { return(null); } object r = ProcessPrepare(pfrom, pto, () => null); if (r != null) { return(r); } return(ProcessComplete(pfrom, pto, skip, sk => { if (sk || !Extract) { return null; } if (!fi.Directory.Exists) { DirectoryInfo di = Directory.CreateDirectory(dirName); if (dirZipEntry != null) { setAttributes(di, dirZipEntry); } } const FileAttributes mask = (FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System); if (fi.Exists && (fi.Attributes & mask) != 0) { fi.Attributes = fi.Attributes & ~mask; } try { using (Stream outputStream = Context.CreateStream(targetName)) { StreamUtils.Copy(zip.GetInputStream(entry), outputStream, new byte[16384], delegate(object x, ProgressEventArgs y) { Context.OnProgress(1, y.Name); }, ProgressInterval, this, entry.Name, entry.Size); } } catch { File.Delete(targetName); throw; } setAttributes(fi, entry); return null; })); } return(null); }
object extractZip(object zipFileName, string rootDirectory, IStringFilter nf, IStringFilter df) { object ret = null; WindowsNameTransform extractNameTransform = new WindowsNameTransform(rootDirectory); Dictionary <string, bool> dirs = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase); Stream str; if (zipFileName is byte[]) { str = new MemoryStream((byte[])zipFileName); } else { str = new SeekableStream(Context.OpenStream(zipFileName.ToString()), true); } using (ZipFile zip = new ZipFile(str)) { if (Password != null) { zip.Password = Context.TransformStr(Password, Transform); } foreach (ZipEntry entry in zip) { string targetName = null; if (entry.IsFile) { targetName = extractNameTransform.TransformFile(entry.Name); if (!UsePath) { targetName = Path.Combine(rootDirectory, Path.GetFileName(targetName)); } } else if (entry.IsDirectory) { if (UsePath) { targetName = extractNameTransform.TransformDirectory(entry.Name); } else { targetName = rootDirectory; } } if (string.IsNullOrEmpty(targetName)) { continue; } if (!Hidden) { if (isDos(entry) && (((FileAttributes)entry.ExternalFileAttributes) & (FileAttributes.Hidden)) != 0) { continue; } } if (string.IsNullOrEmpty(entry.Name)) { continue; } var n = new ZipFSEntry(entry, ZipTime); if ((entry.IsFile && df.IsMatch(Path.GetDirectoryName(n.FullName)) && nf.IsMatch(n.Name)) || (entry.IsDirectory && df.IsMatch(n.FullName))) { object r = extract(zip, rootDirectory, targetName, entry, dirs); if (r != null) { return(r); } } } } return(ret); }
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; }
object extractZip( object zipFileName, string rootDirectory,IStringFilter nf, IStringFilter df) { object ret = null; WindowsNameTransform extractNameTransform = new WindowsNameTransform(rootDirectory); Dictionary<string, bool> dirs = new Dictionary<string, bool>(StringComparer.InvariantCultureIgnoreCase); Stream str; if (zipFileName is byte[]) str = new MemoryStream((byte[])zipFileName); else str=new SeekableStream(Context.OpenStream(zipFileName.ToString()),true); using (ZipFile zip = new ZipFile(str)) { if (Password != null) zip.Password = Context.TransformStr(Password, Transform); foreach (ZipEntry entry in zip) { string targetName = null; if (entry.IsFile) { targetName = extractNameTransform.TransformFile(entry.Name); if (!UsePath) targetName = Path.Combine(rootDirectory, Path.GetFileName(targetName)); } else if (entry.IsDirectory) { if (UsePath) targetName = extractNameTransform.TransformDirectory(entry.Name); else targetName = rootDirectory; } if (string.IsNullOrEmpty(targetName)) continue; if (!Hidden) { if (isDos(entry) && (((FileAttributes) entry.ExternalFileAttributes) & (FileAttributes.Hidden)) != 0) continue; } if (string.IsNullOrEmpty(entry.Name)) continue; var n = new ZipFSEntry(entry, ZipTime); if ((entry.IsFile && df.IsMatch(Path.GetDirectoryName(n.FullName)) && nf.IsMatch(n.Name)) || (entry.IsDirectory && df.IsMatch(n.FullName))) { object r = extract(zip, rootDirectory, targetName, entry, dirs); if (r!=null) return r; } } } return ret; }
object extract(ZipFile zip, string rootDirectory,string targetName, ZipEntry entry, Dictionary<string, bool> dirs) { string dirName; if (UsePath) dirName = (entry.IsFile) ? Path.GetDirectoryName(Path.GetFullPath(targetName)) : targetName; else dirName = rootDirectory; // Get date time from entry DateTime? entryTimeUtc = getEntryTimeUtc(entry); // Create directory bool skip = false; string zipDirName = string.Empty; ZipEntry dirZipEntry = null; if (entry.IsFile) { zipDirName = Path.GetDirectoryName(entry.Name); dirZipEntry = zip.GetEntry(zipDirName); if (dirZipEntry == null) dirZipEntry = zip.GetEntry(zipDirName + "/"); } else { zipDirName = entry.Name; dirZipEntry = entry; } if (dirs.TryGetValue(zipDirName, out skip) && skip) return null; if (entry.IsDirectory) { DirectoryInfo dir = new DirectoryInfo(dirName); var zz = new ZipFSEntry(entry, ZipTime); var to=new FileOrDirectoryInfo(dir); object r = ProcessPrepare(zz, to, () => null); if (r==null) r = ProcessComplete(new ZipFSEntry(entry, ZipTime), new FileOrDirectoryInfo(dir), skip, skp=>{ dirs[zipDirName] = skip = skp; if (Extract && !skp) { DirectoryInfo di = Directory.CreateDirectory(dirName); setAttributes(di,entry); } return null; }); if (r != null || skip) return r; } if (entry.IsFile) { var pfrom = new ZipFSEntry(entry, ZipTime); var fi = new FileInfo(targetName); var pto = new FileOrDirectoryInfo(fi); if (fi.Exists) { if (Overwrite == OverwriteMode.Never) skip = true; if (Overwrite == OverwriteMode.IfNewer) { if (entryTimeUtc == null || entryTimeUtc <= File.GetLastWriteTimeUtc(targetName)) { VerboseMessage("Ignoring never file {0}", targetName); skip = true; } } } if ((skip && Overwrite != OverwriteMode.Confirm)) return null; object r = ProcessPrepare(pfrom, pto, () => null); if (r != null) return r; return ProcessComplete(pfrom, pto, skip, sk => { if (sk || !Extract) return null; if (!fi.Directory.Exists) { DirectoryInfo di = Directory.CreateDirectory(dirName); if (dirZipEntry != null) setAttributes(di,dirZipEntry); } const FileAttributes mask = (FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System); if (fi.Exists && (fi.Attributes & mask)!=0) fi.Attributes = fi.Attributes & ~mask; try { using (Stream outputStream = Context.CreateStream(targetName)) { StreamUtils.Copy(zip.GetInputStream(entry), outputStream, new byte[16384], delegate(object x, ProgressEventArgs y) { Context.OnProgress(1, y.Name); }, ProgressInterval, this, entry.Name, entry.Size); } } catch { File.Delete(targetName); throw; } setAttributes(fi, entry); return null; }); } return null; }