в C # .NET Framework 2.0, как я могу разархивировать ZIP-файл в указанный каталог и подождать, пока это не будет сделано, прежде чем двигаться дальше - PullRequest
0 голосов
/ 25 июня 2010

У меня есть файл .zip, который нужно извлечь моему приложению, и как мне это сделать?ему нужно распаковать Programs \ Test \ Build.zip в каталог:

string tempFolder = System.Environment.GetEvironmentVariable("HomeDrive");

, затем нужно дождаться его завершения, а затем запустить exe-файл "Compile.exe", идеи?

Ответы [ 4 ]

1 голос
/ 10 октября 2013
//  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vjslib.dll
    // <add assembly="vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    public class ZipWriter : Stream {
        public ZipWriter() { dest = new MemoryStream(); }
        public ZipWriter(Stream owner) { dest = owner; }
        public ZipWriter(Stream owner, string FileName) { dest = owner; AddFile(FileName); }



        public void AddFile(string FileName) {
            if (writer == null) writer = new zipwriter(this);                
            if (writer.az == null) writer.az = new java.util.zip.ZipOutputStream(writer); else writer.az.closeEntry();
            writer.az.putNextEntry(new java.util.zip.ZipEntry(FileName));

        }

        public byte[] ToArray() { finalize(); return ((MemoryStream)dest).ToArray(); }


        public void finalize()
        { /*Закрыть архив*/
            if (writer.az == null) return; writer.az.closeEntry(); writer.az.finish(); writer.az = null;
        }
        public override long Length { get { finalize(); return dest.Length; } }

        /*Забрать zip*/


        public Stream dest;

        class zipwriter : java.io.OutputStream
        {                
            public ZipWriter parent;
            public java.util.zip.ZipOutputStream az;
            public override void write(sbyte[] buffer, int offset, int count){ 
                if (count<=0) return;
                byte[] dest = new byte[offset + count];
                Buffer.BlockCopy(buffer, offset, dest, offset, count);
                parent.dest.Write( dest, offset,count);              
            }
            public override void write(int b) {  parent.dest.WriteByte((byte)b); }
            public zipwriter(ZipWriter owner) { parent = owner; }

        }
        zipwriter writer;
        long      position;
        public override bool CanRead { get {return false; } }            
        public override bool CanSeek { get {return false;} }            
        public override bool CanWrite { get {return true;} }


        public override long Position { get {  return position;  } set { position = value;} }            
        protected override void Dispose(bool disposing){  }
        public override void Flush() { dest.Flush(); }            
        public override int Read(byte[] buffer, int offset, int count){ return 0;}

        public override long Seek(long offset, SeekOrigin origin) {  return position; }

        public override void SetLength(long value) { }

        public override void Write(byte[] buffer, int offset, int count){                                 
            if (count<=0) return;                
             sbyte[] dest = new sbyte[offset + count];
             Buffer.BlockCopy(buffer, offset, dest, offset, count);
             writer.az.write(dest, offset, count);
             position += count;                
           }
       }


       /* Example:
          ZipWriter ZipStream = new ZipWriter();
          ZipStream.AddFile("1.txt");
          ...  ZipStream.WriteByte(65);

         Response.Clear();
         Response.ContentType = "application/force-download";
         Response.AddHeader("content-disposition",   "attachment; filename=1.zip");
         Response.BinaryWrite(ZipStream.ToArray());
         Response.End();          
       */
1 голос
/ 29 июня 2010
1 голос
/ 25 июня 2010

Ну, во-первых, вы можете извлечь его из кода, используя SharpZipLib .

Для распаковки полного zip-файла есть образец .

Как только это будет сделано, просто используйте Process.Start для запуска исполняемого файла.

0 голосов
/ 25 июня 2010

Я предлагаю использовать SharpZipLib, как описано здесь . Он прост в использовании, и я думаю, что он синхронный по умолчанию. См. эту страницу с примерами использования.

А затем просто выполните его, используя Process.Start

...