眞鍋です
ファイルステートを同期関数で取得して良いのであれば、こう書くこともできます。
---- (ここから)
//var f = 'path/to/file';
var fStat = fs.statSync(f);
if(!fStat) return ; // ファイルが存在せず、ステート取得出来ない場合
// ファイルと同サイズのメモリ領域を確保
cache[f] = { content: new Buffer(fStat.size) };
// fileStream のイベント定義
var s = fs.createReadStream(f);
s.once('open', function () { /* omitted */ });
s.once('error', function (e) { /* omitted */ });
var bufferOffset = 0;
s.on('data', function(data) { /* omitted */ });
---- (ここまで)
yusuke さんによるコメント済みなので詳細は省略しました。
初期化されているキャッシュのオブジェクト構造にも着目すると良いかと思います。
キャッシュは以下の構造が想定されている。
cache :{
'path/to/file' : {
content: new Buffer(fStat.size)
},
'path/to/file2' : {
content: new Buffer(fStat2.size)
},
:
'path/to/fileN' : {
content: new Buffer(fStatN.size)
}
}
2013年4月14日 20:35 yusuke <[email protected]>:
> コメントで書きました。
>
>>
>>
> var s = fs.createReadStream(f).once('open', function () {
>> response.writeHead(200, headers);
>> this.pipe(response);
>> }).once('error', function (e) {
>> console.log(e);
>> response.writeHead(500);
>> response.end('サーバエラー!');
>> });
>>
>> fs.stat(f, function(err, stats) { // 対象としてるファイルが f
>> var bufferOffset = 0; // 最初は頭から
>> cache[f] = {content: new Buffer(stats.size)}; // cache の中に f 専用の
>> buffer を、 f のサイズで作ってる。
>>
> s.on('data', function(data) { // 上で作ったストリームで data イベントが起こったら
>> data.copy(cache[f].content, bufferOffset); // そのバッファ(data)を cache
>> の中の f 用の領域にコピーする。オフセットは後述
>> bufferOffset += data.length; // オフセットを更新
>> });
>> });
>> return
>>
>> --
>>
>
> buffer は、まあ byte の配列だと思って下さい。
> 最初にその配列をファイルのサイズで確保します。
> これを chache の中に確保しているので、これはキャッシュなのでしょう。
>
> 'data' イベントが起こった時の引数 data も buffer です。
> この引数の buffer を chache に確保した buffer (ここでは cahce[f].content) の中にコピーします。
>
> data.copy(cache[f].content, bufferOffset);
>
> 最初は cache の頭から入れる必要があるので offset は 0 です。
> しかし、次の data イベントでは、最初に入れた領域の次の領域から入れる必要があります。
> なので、最後に offset を書き込んだ分だけ増やします。
>
> bufferOffset += data.length; // オフセットを更新
>
> こうして、次の data イベントでは、既に書き込んだ部分の次の領域から書き込めます。
>
> 最終的には、 chache[f] の中に、コンテンツのコピーがまるまる格納された状態になる。
>
>
> イメージで言うと。
> 書きたいbuffer を a 書き込み先 buffer を b として、
> 今 buffer b は長さ 10 で確保されてるとすると。
>
> a = [1, 2, 3 ];
> b = [ , , , , ];
> a.copy(b, 0); // [1, 2, 3, , ]
>
> ここにさらに以下を追記したいとする。
> c = [4, 5]
>
> c.copy(b, 3); // [1, 2, 3, 4, 5]
>
> 末尾に追記したいので copy() の第二引数が 3 になってます。
> これは先のソースの bufferOffset です。
>
> Buffer の copy には他にも省略可能引数があります。
> 詳細はこちらを見て下さい。
>
>
> http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/buffer.html#buffer_buf_copy_targetbuffer_targetstart_sourcestart_sourceend
>
>
> という感じでどうでしょうか?
>
> Jxck
>
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、[email protected]にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>
>
--
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。