2014-08-27 108 views
0

這是最優雅的方式或技術,讓node.js服務器知道是否在服務器上創建文件?node.js服務器可以知道是否創建了服務器文件?

這個想法是:一個新的圖像已經創建(從網絡攝像頭等) - >發送一個事件!

UPDATE:在目錄中的新的文件的名稱是不知道先驗和由外部軟件生成的文件。

+0

如何被創建的文件?如果它是生成文件的節點,可能會觸發事件,或者其他程序可能通過IPC通知節點服務器。 – Adam 2014-08-27 22:45:44

+0

該文件是由外部程序生成的 – 2014-08-28 00:43:35

回答

1

我來到了這裏使用此代碼我自己的解決方案:

var fs = require('fs'); 

var intID = setInterval(check,1000); 

function check() { 
    fs.exists('file.txt', function check(exists) { 
     if (exists) { 
      console.log("Created!"); 
      clearInterval(intID); 
     } 
    }); 
} 

你可以一個參數添加到檢查功能與文件的名稱,並調用它的路徑。

我在fs.watch()上做了一些測試,如果沒有創建文件,它也不起作用。 fs.watch()有多個問題無論如何,我絕不會建議使用它...它確實能夠檢查文件是否被刪除,但...

+0

hank你的建議。這個想法是更通用的,即:我有一個目錄。當一個新文件彈出(你不知道它的名字,可能它包含一個時間戳或一個隨機字符串)時,節點如何知道? – 2014-08-28 00:45:23

+0

您將始終知道該名稱,因爲上傳時可以獲取該文件的屬性,例如名稱或大小。 – 2014-08-28 00:47:15

+0

另外,如果由於某種原因,你不知道文件名,你可以使用抓取所有的正則表達式,但這也會更新機器上其他國家的其他用戶正在更新的所有文件,沒有建議。 – 2014-08-28 00:50:59

2

你應該看看fs.watch()。它允許您「觀察」文件或目錄,並在事情發生變化時接收事件。

注:文檔狀態fs.watch不是跨平臺的一致性,所以你應該在使用它之前考慮。

fs.watch(fileOrDirectoryPath, function(event, filename) { 
    // Something changed with filename, trigger event appropriately 
}); 

另外一個需要注意的從文檔:

提供回調文件名參數不支持每 平臺(目前它僅支持Linux和Windows)上。即使在 支持的平臺文件名並不總是保證提供。 因此,不要認爲文件名參數總是在 回調中提供,並且如果爲空,則有一些回退邏輯。

如果filename無法在您的平臺上,你看,你可能需要做一些事情,你最初讀的目錄,並緩存在它的文件列表目錄。然後,當您從fs.watch獲得事件時,請再次閱讀該目錄並將其與緩存的文件列表進行比較,以查看添加的內容(如果有的話)。


更新1:有一個很好的模塊調用watch, on github,這使得它易於觀看的新文件的目錄。


更新2:我扔在一起如何使用fs.watch一個例子,當新的文件添加到一個目錄來獲取通知。我認爲我上面鏈接的模塊可能是更好的方法,但我認爲如果你自己做,它會是一個很好的例子。

注:這是一個相當簡單的例子,只是爲了說明它是如何工作的。它幾乎肯定可以更有效地完成,而且還遠遠沒有經過全面測試。

function watchForNewFiles(directory, callback) { 
    // Get a list of all the files in the directory 
    fs.readdir(directory, function(err, files) { 
     if (err) { 
      callback(err); 
     } else { 
      var originalFiles = files; 

      // Start watching the directory for new events 
      var watcher = fs.watch(directory, function(event, filename) { 
       // Get the updated list of all the files in the directory 
       fs.readdir(directory, function(err, files) { 
        if (err) { 
         callback(err); 
        } else { 
         // Filter out any files we already knew about 
         var newFiles = files.filter(function(f) { 
          return (originalFiles.indexOf(f) < 0); 
         }); 

         // Reset our list of "original" files 
         originalFiles = files; 

         // If there are new files detected, call the callback 
         if (newFiles.length) { 
          callback(null, newFiles); 
         } 
        } 
       }) 
      }); 
     } 
    }); 
} 

然後,看你會跟調用它的目錄:

watchForNewFiles(someDirectoryPath, function(err, files) { 
    if (err) { 
     // handle error 
    } else { 
     // handle any newly added files 
     // "files" is an array of filenames that have been added to the directory 
    } 
}); 
+0

你爲什麼要用'fs.watch'是'fs.exists'可用?另外,我想我記得在某處讀到'fs.watch()'創建了它找不到的文件(我認爲) – 2014-08-27 23:14:02

+1

這個問題似乎在問如何檢測正在創建的新文件。 'fs.watch'可以通過操作系統級別的API執行此操作,而無需輪詢文件系統;即它效率更高。 – 2014-08-27 23:16:09

+0

我會去測試一下:brb – 2014-08-27 23:17:09

相關問題