Skip to content

Instantly share code, notes, and snippets.

@bga
Created February 25, 2011 15:08
Show Gist options
  • Select an option

  • Save bga/843909 to your computer and use it in GitHub Desktop.

Select an option

Save bga/843909 to your computer and use it in GitHub Desktop.
var _copyFile = function(
iName,
oName,
_ret
)
{
var CHUNK_SIZE = 65536;
var _copy = function(iF, oF, size, _ret)
{
var freeBuffersStack = [];
var pos = 0;
var _read = function(){
var b = freeBuffersStack.pop() || Buffer(CHUNK_SIZE);
var p = pos;
fs.read(iF, b, 0, CHUNK_SIZE, p, function(err)
{
if(err) return _ret(err);
_write(b, p);
pos += CHUNK_SIZE;
if(pos < size) setTimeout(_read);
})
};
var _write = function(b, pos)
{
fs.write(oF, b, 0, CHUNK_SIZE, pos, function(err)
{
if(err) return _ret(err);
freeBuffersStack.push(b);
if(pos >= size) _ret()
})
};
};
var _run = function() {
var __beforeRet = _run, // ala `defer` from Go, but contunuation passing version
_beforeRet = function(_fn){
var _old = __beforeRet;
__beforeRet = function(){ _fn(_old) };
}
;
try
{
var iF; fs.open(iName, 'r', 0, function(errArg, fArg){ err = errArg; iF = fArg; _run() });
yield;
if(err) throw err;
_beforeRet(function(_next){ fs.close(iF, _next) });
var oF; fs.open(oName, 'w', 0, function(errArg, fArg){ err = errArg; oF = fArg; _run() });
yield;
if(err) throw err;
_beforeRet(function(_next){ fs.close(oF, _next) });
var size; fs.stat(iName, function(errArg, stat){ if(err) errArg = err else size = stat.size; _run() })
yield;
if(err) throw err;
_copy(iF, oF, size, function(errArg){ err = errArg; _run() })
yield;
if(err) throw err;
}
catch(errArg)
{
err = errArg;
}
setTimeout(_beforeRet, 0)
yield;
return _ret(err);
};
_run();
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment