2012-03-06 67 views
0

這是一個比真正特定於語言的問題更普遍的問題。我必須實現一個程序,它會自動處理csv文件(讀取文件,寫入數據庫,移動文件)。這根本不是問題。檢查需要處理的新文件的最佳方法

問題是 - 我有一個目錄結構像下面那樣,並且如果有任何需要處理的新文件需要定期檢查(將會像5分鐘左右)...

-+ basedir 
--+ AT (ISO country abbreviation ...) 
--+ DE 
---+ ID1234 (directory for user) 
---+ ID2345 
---+ ID4523 
---+ ... 

你知道如何以非常高效的方式瀏覽每個目錄嗎?我認爲對所有目錄執行循環並掃描它們並不是那麼好。

文件通過FTP上傳,我完全控制服務器。

回答

2

看着自己的FTP服務器上的日誌是一個好主意,尤其是如果你有很多子目錄進行掃描。 A tail避免了輪詢解決方案的開銷,並且會精確地告訴您在哪裏查找文件。但是,我認爲,使用shell比使用PHP更容易實現。

我有一個服務器,該服務器產生的日誌,其中包括像這樣的線路上vsftpd的:

Fri Feb 24 05:37:43 2012 [pid 86561] [bob] OK UPLOAD: Client "10.2.3.4", "/path/to/file.txt", 6036 bytes, 32.77Kbyte/sec 

要觸發基於此行動,我可以用一個shell腳本如下所示:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read junk junk junk junk junk junk junk user status command junk sourceip file junk; do 
    if [ "$command" = "UPLOAD:" -a "$status" = "OK" ]; then 
    if echo "$file" | grep -q '/path/to/.*\.txt'; then 
     # do some triggered action, like: 
     sql="INSERT INTO log VALUES ('$user', '$sourceip', '$file')" 
     if mysql -uusername -ppasswd -Ddbname -e"$sql"; then 
     filename="`echo \"$file\" | sed -r 's/\"(.*)\",$/\\1/'`" 
     mv "$filename" /path/to/donefiles/ 
     fi 
    fi 
    fi 
done 

這可以使用您的操作系統的正常啓動工具啓動,或由cron使用@reboot特殊啓動。

添加錯誤處理的味道。

+0

聽起來相當不錯。必須檢查出來。同時謝謝你:-)! – thedom 2012-03-06 17:40:56

0

您可以爲ftp設置日誌並解析日誌以查找新事件。

或者嘗試類似的inotify,fschange,審計,...

相關問題