Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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;
        }
Esempio n. 6
0
        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;
        }
Esempio n. 7
0
        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;
        }
Esempio n. 8
0
        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;
        }