2013-04-08 88 views
0

基本上我必須監視新創建文件的文件夾。識別新創建的文件並對其進行處理

在我的項目,我們有運行,每10分鐘之後,我們現在做的是讀取所有的文件名,並在數據庫中檢查其是否已經處理或沒有,如果沒有,那麼處理使DB中的條目和調度處理它。

我GOOGLE了它,發現幾個解決方案涉及到像JNotify,FileAlterationObserver類和FileAlterationMonitor的路徑,但有大約20個文件夾我必須監視,所以我正在尋找任何簡單的解決方案,比如每當我讀取文件標記它(重新命名並附加「已處理」至其名稱或任何唯一文本),然後下次讀取未標記爲「已處理」的文件。

採用這種方法,我將不得不讀取文件夾中的所有文件,並檢查每個文件名是否與「加工」或沒有結束。

我是新來的Jave所以我不知道是否有可能或沒有,所以我的問題是,我可以查詢所有這一切都沒有用「加工」結尾的文件名,而無需遍歷所有在場的文件名在文件夾中?

或者任何人有任何其他解決方案?

回答

0

如果您可以更改文件名,那麼您可以將文件重命名爲'old_file_name + Processed',然後僅處理那些名稱不以處理結束的文件名。

+0

我可以查詢所有這一切都不能以「加工」不遍歷所有存在的文件夾中的文件名結尾的文件名? – 2013-04-08 13:22:34

1

一旦處理完成,我們需要該文件了嗎?誰在修改文件?如果是通過程序,該程序是否需要關於已處理文件的信息?當該程序要修改文件要重新將其重命名爲file1_processedfile1
如果你改變了文件名(儘管我不知道你係統的內外關係,但我覺得它會被修改),你必須考慮這些用例以及更多。
更好的是你我們JNotifier,它使用起來非常簡單。使用這個你實際上可以刪除調度器。每當某個特定文件(添加/修改等)發出通知時,您可以實際更新數據庫的時間僅限特定文件,無需遍歷文件夾。
只要確保在少數情況下,您可以在JNotifier(例如,當添加新文件時,您將被添加,修改,重命名後您將被重命名,修改。所以這些東西你必須小心。
有了舊的調度程序,你也可以做同樣的事情。您可以將上次更新的文件時間戳保存在數據庫中。在下一個計劃中,您只需檢查最新的時間戳,如果時間戳較新,則處理它並重新更新數據庫。
你也可以做JNotify和調度程序的組合。通過jnotify更新一些ADT中更改/修改的文件名,調度程序可以在ADT內部進行搜索,獲取修改後的文件路徑並僅在數據庫中更新這些文件。


您可以從下面的例子幫助,

public void register(String path) throws JNotifyException { 
     int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED 
       | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED; 
     boolean watchSubtree = true; 
     if (pathSet.contains(path)) { 
      return; 
     } 
     System.out.println("Adding watch for: " + path); 
     JNotify.addWatch(path, mask, watchSubtree, 
       new JNotifyListener() { 

        @Override 
        public void fileCreated(int arg0, String folderName, String fileName) { 
         fileChanged("New object created: " + fileName + " in folder: " + folderName); 

        } 

        @Override 
        public void fileDeleted(int arg0, String folderName, String fileName) { 
         fileChanged(fileName + " deleted in folder: " + folderName); 
        } 

        @Override 
        public void fileModified(int arg0, String folderName, String fileName) { 
//      fileChanged(fileName + " modified in folder: " + folderName); 
        } 

        @Override 
        public void fileRenamed(int arg0, String folderName, String oldFileName, 
          String newFileName) { 
         fileChanged(oldFileName + " renamed to: "+ oldFileName +" in folder: " + folderName); 
        } 
       }); 
    } 

    private void fileChanged(String str){ 
     //your code here 
    } 
+1

一旦處理,我們不再需要該文件,我們只需要新創建的文件,所以我不需要修改,刪除操作,但我必須監視20這樣的路徑,所以我應該使用JNotifier,因爲如果它由於某種原因失敗,那麼將是大問題 – 2013-04-09 09:35:52

+0

如果你不需要處理文件,那麼你可以簡單地將它們移出你的文件夾,並把它們放到某個歸檔文件夾中。當您的程序在原始文件夾內搜索時,它不會獲取這些處理文件,只會獲取新文件。有了這個,你不必檢查任何條件,如加工或沒有等...所以你的程序性能和可維護性會增加。 – 2013-04-10 06:44:51

+0

yup,但將它們移動到另一個文件夾意味着服務器上的一個新文件夾,我不確定我們能做到這一點,因爲歸檔是任何方式自動化控制m作業歸檔1個月的文件。 – 2013-04-10 07:18:22

相關問題