www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Help with Out Of Memory D v1.0

Greetings!

I have this program that zips a file and everything works perfectly, if the 
files are small enough.  But, I am having to zip files that are getting more 
and more extreme in size and I am running out of memory.  Here is the output 
when executing a small program to zip a folder:

 0:36:59.76>zipafile
Zipping file no 0 huge\0.pdf
 ** PLEASE WAIT FOR FILE #0 TO BE ZIPPED **
Zipping file no 1 huge\1.exe
 ** PLEASE WAIT FOR FILE #1 TO BE ZIPPED **
Zipping file no 2 huge\2.exe
 ** PLEASE WAIT FOR FILE #2 TO BE ZIPPED **
Zipping file no 3 huge\updates\p.zip
 ** PLEASE WAIT FOR FILE #3 TO BE ZIPPED **
Zipping file no 4 huge\updates\q.html
 ** PLEASE WAIT FOR FILE #4 TO BE ZIPPED **
Zipping file no 5 huge\updates\z.exe
 ** PLEASE WAIT FOR FILE #5 TO BE ZIPPED **
finished all files...
 ** PLEASE WAIT FOR ZIP FILE TO BE CREATED **
Error: Out of memory

 0:37:56.26>

This is the program in question...

import std.stdio;
import std.file;
import std.date;
import std.zip;
import std.zlib;
import jic.libs.MyFile;

int main(char[][] args)
{

  char[] folder = r"c:\tmp\huge";
  ZipAFolder(folder);
  return 0;
}

void ZipAFolder(char[] zipFolder)
{
  char[] fdname = std.path.getDirName(zipFolder);
  char[][] allfiles = std.file.listdir(zipFolder,"*");
  char[] zipFile = zipFolder ~ ".zip";
  int FilesCnt = 0;

  std.zip.ZipArchive zr;
  zr = new std.zip.ZipArchive();
  int one = 0;
  foreach(char[] f; allfiles)
  {
    char[] f0 = std.string.replace(f,fdname ~ "\\","");  // Filename
    writefln("Zipping file no " ~ std.string.toString(one) ~ " " ~ f0);

    ArchiveMember am = new ArchiveMember();
    am.compressionMethod = 8;
    am.name = f0;
    //am.expandedData = cast(ubyte[]) f.read();
    am.expandedData = cast(ubyte[]) f.read();
    am.expandedSize = am.expandedData.length;
    FileData fd0 = GetFileInfo(f);
    long usedT0;
    if (fd0.creationTime > fd0.modifiedTime)
    {
      usedT0 = fd0.creationTime;
    }
    else
    {
      usedT0 = fd0.modifiedTime;
    }
    am.time = std.date.toDosFileTime(usedT0);
    zr.addMember(am);
    writefln(" ** PLEASE WAIT FOR FILE #" ~ std.string.toString(one) ~ " TO 
BE ZIPPED ** ");

    one++;
  }
  writefln("finished all files...");
  writefln(" ** PLEASE WAIT FOR ZIP FILE TO BE CREATED ** ");
  std.file.write(zipFile, cast(byte[])zr.build());
  writefln(" ** " ~ std.string.toString(one) ~ " FILES ZIPPED ** ");
  writefln(zipFile ~ " created.");
  //return 1;
}

As you can see, the last two writelns do not get printed because of the Out 
Of Memory.  Any help would be greatly appreciated.  Thanks.

josť
Dec 17 2012