2013-04-03 75 views
3

讓我認爲我正在異步讀取文件500 MB。這需要時間來閱讀。現在在異步讀取文件時,如何停止/中止讀取文件並調用回調函數(即successfulAbort)?如何在node.js中停止/中止讀取文件

fs.readFile(filePath, function(err, data) { 
    //Do work 
}); 
+0

嗨,爲什麼你想中止操作? – karthick

+0

讀取文件時,我的應用程序可能會收到來自另一臺服務器的停止信號,我應該立即停止讀取文件(無需讀取完整文件)。 – Somnath

回答

1

只要使用fs.read(與fs.open),而不是fs.readFile。例如:

fs.open(filepath, 'r', function(err, fd) { 

    var finalize = function(buffer) { 
     fs.close(fd); 
     console.log(buffer); 
    }; 

    if (err) { 
     finalize(); 
     return; 
    } 

    fs.fstat(fd, function(err, stats) { 
     if (err) { 
      finalize(); 
      return; 
     } 

     var bufferSize = stats.size, 
      chunkSize = 512, 
      buffer = new Buffer(bufferSize), 
      bytesRead = 0; 

     var inner_read = function() { 
      if ((bytesRead + chunkSize) > bufferSize) { 
       chunkSize = (bufferSize - bytesRead); 
      }; 
      if (chunkSize > 0) { 
       fs.read(fd, buffer, bytesRead, chunkSize, bytesRead, function(err) { 
        // YOU CAN DO SOMETHING HERE TO STOP READING 
        if (err) { 
         finalize(buffer); 
         return; 
        } 
        bytesRead += chunkSize; 
        inner_read(); 
       }); 
      } else { 
       finalize(buffer); 
      } 
     } 
     inner_read(); 
    }); 
}); 
+0

嘿@frakish謝謝。我正在嘗試你的榜樣。我會盡快回復您。 – Somnath

1

fs.readFile確實讀取文件異步方式,但直到整個文件已被讀取它不會調用你的回調,所以你不能用這種方法實現這一目標。相反,我相信你必須使用fs.createReadStream(),它會給你一個stream.Readable。然後你可以爲這個對象實現適當的事件。

function readTheFile(fileName, callback) { 
    var stream = fs.createReadStream(fileName); 
    stream.on('readable', function() {}); // Do your read logic 
    stream.on('error', function(err) {}); // Handle the error 
} 
+0

這個想法也很好看。我尚未完成實施。我會回到你們身邊。 – Somnath