2015-11-22 54 views
1

我需要使用graphicsmagick來操作圖像。使用graphicsmagick在collectionFS中進行相同的讀取和寫入流

我FSCollection看起來是這樣的:

Images = new FS.Collection("media", { 
    stores: [ 
     new FS.Store.FileSystem("anything"), 
     new FS.Store.FileSystem("something") 
    ], 
}); 

我的問題是,該writeStream應該像readStream一樣。這不起作用,因爲這會導致一個空的結果:

var read = file.createReadStream('anything'), 
    write = file.createWriteStream('anything'); 

gm(read) 
    .crop(100,100,10,10) 
.stream() 
.on('end',function(){ console.log('done'); }) 
.on('error',function(err){ console.warn(err); }) 
.pipe(write, function (error) { 
    if (error) console.log(error); 
    else console.log('ok'); 
}); 
+1

無法像這樣同時讀取和寫入同一文件;有效地,當你還在讀取文件時,你將覆蓋部分文件。最好的辦法是寫入一個單獨的文件,然後在完成後重命名它。 –

+0

@ExplosionPills這是有道理的:-)我不熟悉使用流。我怎樣才能使用臨時文件? – user3848987

回答

1

從同時讀取和寫入同一個文件是不可能的,因爲你會在你試圖從中讀取數據的同時覆蓋內容。寫入不同的文件,然後將其重命名爲原始文件。

var read = file.createReadStream('anything'), 
    write = file.createWriteStream('anything-writeTo'); 

gm(read) 
    .crop(100,100,10,10) 
.stream() 
.on('error',function(err){ console.warn(err); }) 
.pipe(write, function (error) { 
    if (error) console.log(error); 
    else console.log('ok'); 
}) 
.on('end',function(){ 
    file.rename("anything-writeTo", "anything", function (err) { 
     if (err) console.error(err); 
     else console.log('rename complete'); 
    }); 
}) 
+0

這給了我'ReferenceError:fs沒有定義'。我可以使用商店的「任何」和「某物」(如我的示例代碼中所示)並將「某物」重命名爲「任何物品」?我的意思是'anything-writeTo'應該是'something'... – user3848987

+0

@ user3848987改爲'file'而不是'fs'。你可以使用任何你想要的名字,但想法是你不會嘗試寫入一個現有的文件。 –

+0

fs = Npm.require('fs'); – Tobi

相關問題