コード例 #1
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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);
        }
コード例 #2
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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);
        }
コード例 #3
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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);
        }
コード例 #4
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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;
        }
コード例 #5
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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;
        }
コード例 #6
0
ファイル: Zip.cs プロジェクト: xsharper/xsharper
        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;
        }