Beispiel #1
0
    /// <summary>
    /// 将指定文件压缩到zip文件
    /// </summary>
    /// <param name="sourceFilesPath"></param>
    /// <param name="destinationZipFilePath"></param>
    /// <param name="events"></param>
    /// <param name="recurse"></param>
    /// <param name="fileFilter"></param>
    public static void CreateZip(Dictionary <string, string> sourceFilesPath, string destinationZipFilePath, FileChangeEvent events)
    {
        ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));

        zipStream.SetLevel(9);  // 压缩级别 0-9

        Crc32 crc = new Crc32();
        Dictionary <ZipEntry, byte[]> holders = new Dictionary <ZipEntry, byte[]>();
        long total   = 0;
        long current = 0;

        foreach (var file in sourceFilesPath)
        {
            if (File.Exists(file.Key))
            {
                FileStream fileStream = File.OpenRead(file.Key);
                byte[]     buffer     = new byte[fileStream.Length];
                fileStream.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(file.Value);
                entry.DateTime      = DateTime.Now;
                entry.Size          = fileStream.Length;
                entry.IsUnicodeText = true;
                fileStream.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                holders.Add(entry, buffer);
                total += buffer.Length;
            }
        }

        foreach (var hoder in holders)
        {
            zipStream.PutNextEntry(hoder.Key);
            zipStream.Write(hoder.Value, 0, hoder.Value.Length);
            if (events != null)
            {
                events.Invoke(hoder.Key.Name, total, current += hoder.Value.Length);
            }
        }

        zipStream.Finish();
        zipStream.Close();
    }
Beispiel #2
0
    public static void ExtractZip(string zipFileName, string targetDirectory, FileChangeEvent events)
    {
        if (!File.Exists(zipFileName))
        {
            return;
        }

        if (!Directory.Exists(targetDirectory))
        {
            Directory.CreateDirectory(targetDirectory);
        }

        ZipInputStream s        = null;
        ZipEntry       theEntry = null;

        string     fileName;
        FileStream streamWriter = null;

        try
        {
            long total   = 0;
            long current = 0;

            s = new ZipInputStream(File.OpenRead(zipFileName));
            Dictionary <string, byte[]> dataDic = new Dictionary <string, byte[]>();

            while ((theEntry = s.GetNextEntry()) != null)
            {
                total   += s.Length;
                fileName = Path.Combine(targetDirectory, theEntry.Name);

                if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
                {
                    Directory.CreateDirectory(fileName);
                    continue;//文件夹跳过
                }

                if (theEntry.Name != String.Empty)
                {
                    using (var mem = new MemoryStream())
                    {
                        int    size = 2048;
                        byte[] data = new byte[2048];
                        while (true)
                        {
                            size = s.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                mem.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }
                        dataDic.Add(theEntry.Name, mem.ToArray());
                    }
                }
            }
            foreach (var item in dataDic)
            {
                fileName = Path.Combine(targetDirectory, item.Key);
                ///判断文件路径是否是文件夹
                if (!Directory.Exists(Path.GetDirectoryName(fileName)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
                }
                current     += item.Value.Length;
                streamWriter = File.Create(fileName);
                streamWriter.Write(item.Value, 0, item.Value.Length);
                if (events != null)
                {
                    events.Invoke(item.Key, total, current);
                }
            }
        }

        catch
        {
            throw;
        }
        finally
        {
            if (streamWriter != null)
            {
                streamWriter.Close();
                streamWriter = null;
            }
            if (theEntry != null)
            {
                theEntry = null;
            }
            if (s != null)
            {
                s.Close();
                s = null;
            }
            GC.Collect();
            GC.Collect(1);
        }
    }
Beispiel #3
0
        private void Watcher_Changed(object sender, FileSystemEventArgs e)
        {
            if (!System.IO.Path.HasExtension(e.FullPath))
            {
                if (this._watcher.IncludeSubdirectories)
                {
                    switch (e.ChangeType)
                    {
                    case WatcherChangeTypes.Changed:
                    {
                        this._log.Debug($"File {e.FullPath} Trigger Change Event");
                        FileChangeEvent?.Invoke(e.FullPath);
                    }
                    break;

                    case WatcherChangeTypes.Created:
                    {
                        this._log.Debug($"File {e.FullPath} Trigger Create Event");
                        FileCreateEvent?.Invoke(e.FullPath);
                    }
                    break;

                    case WatcherChangeTypes.Deleted:
                    {
                        this._log.Debug($"File {e.FullPath} Trigger Remove Event");
                        FileRemoveEvent?.Invoke(e.FullPath);
                    }
                    break;
                    }
                }
                else
                {
                    this._log.Debug($"not exist {e.FullPath} file");
                }

                return;
            }

            switch (e.ChangeType)
            {
            case WatcherChangeTypes.Changed:
            {
                DateTime prevDate;
                if (_fileChangeDate.TryGetValue(e.FullPath, out prevDate))
                {
                    var currentDate = File.GetLastWriteTime(e.FullPath);

                    if (prevDate == currentDate)
                    {
                        return;
                    }

                    _fileChangeDate[e.FullPath] = currentDate;
                }
                else
                {
                    _fileChangeDate[e.FullPath] = DateTime.Now;
                }
                this._log.Debug($"File {e.FullPath} Trigger Change Event");
                FileChangeEvent?.Invoke(e.FullPath);
            }
            break;

            case WatcherChangeTypes.Created:
            {
                this._log.Debug($"File {e.FullPath} Trigger Create Event");
                FileCreateEvent?.Invoke(e.FullPath);
            }
            break;

            case WatcherChangeTypes.Deleted:
            {
                this._log.Debug($"File {e.FullPath} Trigger Remove Event");
                FileRemoveEvent?.Invoke(e.FullPath);
            }
            break;
            }
        }