2017-07-06 3 views
0

私は、新たに追加されたファイルを、ノードアプリケーションを実行しているサーバー上のドライブにマップされているftpサーバーに監視しようとしています。問題は、ftpで追加されたファイルのイベントを登録しないことです。ファイルがノードアプリケーションを介して変更または作成されると、それらはうまく取り上げられます。nodejsでディレクトリを見る - ftpによってアップロードされたファイルを登録していない

私は現在のディレクトリを見て、以下の簡単なコードですべてのイベントをログに記録するchokidarを使用してい

const watcher = chokidar.watch('./myDir', { 
persistent: true, 
awaitWriteFinish: { 
    stabilityThreshold: 2000, 
    pollInterval: 100 
} 
}); 

watcher 
.on('add', path => console.log(`File ${path} has been added`)) 
.on('change', path => console.log(`File ${path} has been changed`)); 

私は、ファイルがあるときに、それが登録されるかどうかを確認しようとするawaitWriteFinishオプションを追加しましたftpの転送から完了しましたが、喜んではありません。

提案がありますか?

+0

ネイティブAPIでこれを実行しようとしましたか? https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_watch_filename_options_listener –

+0

はい、同じ結果が得られました。私はchokadirがfs.watchが逃したイベントを登録することで信頼性が高いと読んでいました。 – user1565766

答えて

0

あなたはネイティブモジュールfsを使用してディレクトリを見ることができます:

const fs = require('fs'); 
const folderPath = './test'; 
const pollInterval = 300; 

let folderItems = {}; 
setInterval(() => { 
    fs.readdirSync(folderPath) 
    .forEach((file) => { 
    let path = `${folderPath}/${file}`; 
    let lastModification = fs.statSync(path).mtimeMs; 
    if (!folderItems[file]) { 
     folderItems[file] = lastModification; 
     console.log(`File ${path} has been added`); 
    } else if (folderItems[file] !== lastModification) { 
     folderItems[file] = lastModification; 
     console.log(`File ${path} has been changed`); 
    } 
    }); 
}, pollInterval); 

しかし、上記の例では、サブフォルダ内のファイルを見ることはありません。すべてのサブフォルダを監視するもう1つの方法は、UNIX findをノードchild_process.execの機能で使用することです。

const fs = require('fs'); 
const {execSync} = require('child_process'); 
const folderPath = './test'; 
const pollInterval = 500; 

let folderItems = {}; 
setInterval(() => { 
    let fileList = execSync(`find ${folderPath}`).toString().split('\n'); 
    for (let file of fileList) { 
    if (file.length < 1) continue; 
    let lastModification = fs.statSync(file).mtimeMs; 
    if (!folderItems[file]) { 
     folderItems[file] = lastModification; 
     console.log(`File ${file} has been added`); 
    } else if (folderItems[file] !== lastModification) { 
     folderItems[file] = lastModification; 
     console.log(`File ${file} has been changed`); 
    } 
    } 
}, pollInterval); 
+0

これは、ファイルが/ testディレクトリ内に直接存在する場合に適しています。しかし、私は/ test/xx/xx内のファイルをチェックする必要があります。 – user1565766

+0

UNIXの 'fiind'を使ってすべてのサブフォルダを見る例を追加しました – gnuns

関連する問題