using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.Tar; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; namespace DataClients { public class FileClient { //private char split = '/'; private char split = '\\'; private string dir = @"Y:\data"; //private string dir = @"C:\data"; //private string dir = @"/archive_rmt/data"; public FileClient() { TempDir.StartCkeckDir(); } public FileClient(string directory) { TempDir.StartCkeckDir(); dir = directory; } public byte[] GetFile(DateTime time, ushort vdp, ushort index) { var name = time.ToString("yyyyMMdd") + "." + vdp.ToString("D2") + index.ToString("D1"); var tmpFileName = TempDir.GetTempDirectory() + split + name; if (!TempDir.IsExist(name)) { if (!CheckArchive(time, vdp)) return new byte[0]; if (!ExtractArchive(time, vdp)) return new byte[0]; } if (!TempDir.IsExist(name)) return new byte[0]; while (TempDir.IsProtect(name)) Thread.Sleep(1000); TempDir.AddProtect(name); Stream fs = File.OpenRead(tmpFileName); var result = new List(); try { for (var i = 0; i < fs.Length; i++) result.Add((byte)fs.ReadByte()); return result.ToArray(); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); return new byte[0]; } finally { TempDir.RemoveProtect(name); fs.Close(); } } private bool CheckArchive(DateTime time, ushort vdp) { var tmp = dir + split + time.Year.ToString("D4") + split + time.Month.ToString("D2") + split + time.Day.ToString("D2") + split + vdp.ToString("D2"); return (File.Exists(tmp + ".tar") || File.Exists(tmp + ".tar.gz")); } private bool ExtractArchive(DateTime time, ushort vdp) { var tmp = dir + split + time.Year.ToString("D4") + split + time.Month.ToString("D2") + split + time.Day.ToString("D2") + split + vdp.ToString("D2"); if (File.Exists(tmp + ".tar")) { ExtractTar(tmp + ".tar", TempDir.GetTempDirectory()); return true; } else if (File.Exists(tmp + ".tar.gz")) { ExtractTarGZ(tmp + ".tar.gz", TempDir.GetTempDirectory()); return true; } return false; } private void ExtractTarGZ(String gzArchiveName, String destFolder) { Stream inStream = File.OpenRead(gzArchiveName); Stream gzipStream = new GZipInputStream(inStream); try { TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream); tarArchive.ExtractContents(destFolder); tarArchive.Close(); } catch (Exception e) { Console.WriteLine("Can't extract: " + gzArchiveName); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } finally { gzipStream.Close(); inStream.Close(); } } private void ExtractTar(String tarFileName, String destFolder) { Stream inStream = File.OpenRead(tarFileName); try { TarArchive tarArchive = TarArchive.CreateInputTarArchive(inStream); tarArchive.ExtractContents(destFolder); tarArchive.Close(); } catch (Exception e) { Console.WriteLine("Can't extract: " + tarFileName); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } finally { inStream.Close(); } } } }