2013-04-04 76 views
1

我有一个当前进程提取tar.gz,但当前进程无法处理超过4GB ......我想知道我在做什么错误,导致我使用sharpzip LIB它说,参数的长度不能小于零....所有的注释掉的代码是当前进程24GB tar.gz使用sharpziplib解压缩

请参阅下面的代码,给我方向

public static void ExtractTarGZFiles(string strExtractionPath, string strInboundFolder) 
    { 
     List<string> files = new List<string>(); 
     string strFile = Path.GetFullPath(ConfigurationManager.AppSettings["InboundFolderPath"].ToString()); 
     if (mblnRunForFile) 
     { 
      System.IO.FileInfo ioInfo = new FileInfo(mstrFilename); 
      strFile = ioInfo.DirectoryName; 
      files.Add(ioInfo.Name); 

     } 
     else 
     { 
      files = System.IO.Directory.GetFiles(ConfigurationManager.AppSettings["InboundFolderPath"], "*.gz").ToList(); 
     } 

     foreach (string file in files) 
     { 
      try 
      { 
      //string stFilePath = file; 
      //string testingthisdamnthing = strInboundFolder + mstrFilename; 
      //FileStream xstream = new FileStream(stFilePath, FileMode.Open, FileAccess.Read, FileShare.None); 
      //xstream.Close(); 
      //string strTemp = ConfigurationManager.AppSettings["ExtractTempFolderPath"]; 
      //TarArchive objTA = TarArchive.CreateInputTarArchive(new GZipStream(new FileStream(stFilePath, FileMode.Open, FileAccess.Read), CompressionMode.Decompress)); 
      //objTA.ProgressMessageEvent += ExtractTarNotifier; 
      //objTA.ExtractContents(strTemp); 



      //DirectoryInfo dirtemp = new DirectoryInfo(strTemp); 
      DirectoryInfo dirExtract = new DirectoryInfo(strExtractionPath); 

      Stream inStream = File.OpenRead(stFilePath); 
      Stream gzipStream = new GZipInputStream(inStream); 

      TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream); 
      tarArchive.ExtractContents(ConfigurationManager.AppSettings["ExtractFolderPath"]); 
      tarArchive.Close(); 

      gzipStream.Close(); 
      inStream.Close(); 
      //while (IsFileExistsinTempPath(dirtemp, dirExtract)) 
      //{ 
      // //Do nothing 
      //} 
      //CopyFilesFromTempToExtract(dirtemp, dirExtract); 
      //objTA.Close(); 
      //Logger.Write(" Tar.Gz files Decompressed Successfully"); 
      MonthLog.Log("Tar.Gz files Decompressed Successfully", "Month", 3, 2, System.Diagnostics.TraceEventType.Information, mstrFilename); 
      System.IO.File.Copy(stFilePath, ConfigurationManager.AppSettings["ArchiveFolderPath"] + new FileInfo(stFilePath).Name, true); 
      File.Delete(stFilePath); 
      //Logger.Write(" Tar.GZ files Moved to Archive Folder"); 
      MonthlyGreenPackageLog.Log("Tar.Gz files Moved to Archive Folder", "Month", 3, 2, System.Diagnostics.TraceEventType.Information, mstrFilename); 

      } 
       catch (System.IO.IOException ex) 
       { 
        //go to next file 
        //Logger.Write("Unable to open compressed file"); 
        MonthLog.Log("Unable to open compressed file", "Month", 1, 1, System.Diagnostics.TraceEventType.Error, mstrFilename); 
        Email objEmail1 = new Email(); 
        objEmail1.IsBodyHTML = true; 
        objEmail1.FromAddress = ConfigurationManager.AppSettings["FromAddress"]; 
        string[] strToAddresses = ConfigurationManager.AppSettings["ExceptionAddress"].Split(','); 
        objEmail1.SetToAddress(strToAddresses); 
        objEmail1.Subject = "The Month File " + mstrFilename + " Failed to Decompress "; 
        objEmail1.Body = " Exception " + ex.Message + " occured while decompressing file"; 
        //objEmail.AddAttachment("Exception occured while processingfiles"); 
        objEmail1.SendEmail(); 
        //Logger.Write("Sent a mail to all the Address"); 
        throw ex; 
       } 
       catch (Exception ex) 
       { 
        //Logger.Write("Exception " + ex.Message + " occured while decompressing file"); 
        MonthlyGreenPackageLog.Log("Exception " + ex.Message + " occured while decompressing file", "Monthl", 1, 1, System.Diagnostics.TraceEventType.Error, mstrFilename); 
        Email objEmail = new Email(); 
        objEmail.IsBodyHTML = true; 
        objEmail.FromAddress = ConfigurationManager.AppSettings["FromAddress"]; 
        string[] strToAddresses = ConfigurationManager.AppSettings["ExceptionAddress"].Split(','); 
        objEmail.SetToAddress(strToAddresses); 
        objEmail.Subject = "The tar.gz Month File " + mstrFilename + " Failed to Decompress "; 
        objEmail.Body = " Exception " + ex.Message + " occured while decompressing file"; 
        //objEmail.AddAttachment("Exception occured while processing ADX files"); 
        objEmail.SendEmail(); 
        //Logger.Write("Sent a mail to all the Address"); 
        throw ex; 
       } 

      } 
     } 
+0

你把它编译为x86或x64吗? – Middas 2013-04-04 18:16:53

+0

在X86机器上, – user2133071 2013-04-04 18:21:50

+0

然后你需要弄清楚如何将你的文件分解成4GB的块,你需要64位来玩更多。 – Middas 2013-04-04 18:22:52

回答

0

我对你有三个潜在的解决方案,但我不能告诉你是否有任何人会实际工作。

  1. 使用Unzip from Stream示例通过内存进行流式传输,因此您永远不需要加载整个事物(这就是现在它失败的原因)。
  2. 切换到使用DotNetZip,这可能有更多的选项来处理x86机器上的大文件。
  3. 查找可以编写脚本或可以监视目录的常规unzipper应用程序,并在它到达您的应用程序之前将其解压缩。
+0

我不认为这是一个内存问题,有些描述符字段有可能是64位,其中一个字段的第31位= 1,所以当解释为int32时,它变为负数 – 2013-04-04 18:40:26

+0

您是否使用过7zip命令行?这是如何与x命令一起工作的。? – user2133071 2013-04-04 19:37:00

+0

@ user2133071 - 我没有自己,但[这个链接](http://www.dotnetperls.com/7-zip-examples)有一些很好的细节 – Bobson 2013-04-04 20:24:11

0

如果你有你应用程序为x86,那么每个进程只能有4GB的内存。将其编译为x64以使用更多资源。

+1

如果机器不是x64也没有帮助。 – Bobson 2013-04-04 18:28:27

0

这是来自您正在使用的ZipLibrary。您需要将应用程序编译为x64程序并在64位环境中运行它。

// To permit the zip to be unpacked by built-in extractor in WinXP and Server2003, WinZip 8, Java, and other older code, 
    // you need to do one of the following: Specify UseZip64.Off, or set the Size. 
    // If the file may be bigger than 4GB, or you do not need WinXP built-in compatibility, you do not need either, 
    // but the zip will be in Zip64 format which not all utilities can understand.