/// <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(); }
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); } }
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; } }