0

基本的に、新しく作成されたファイルのフォルダーを監視する必要があります。

私のプロジェクトでは、10分ごとに実行されるスケジューラがあり、すべてのファイル名を読み取り、データベースが既に処理されているかどうかをチェックインし、処理されていない場合はDBにエントリを作成して処理します。

私はそれをグーグルで検索し、 JNotify 、 FileAlterationObserver クラスと FileAlterationMonitor のようなパスへのリストナーを含むいくつかのソリューションを見つけましたが、監視する必要がある約20のフォルダーがあるため、ファイルを読み取るたびに処理済みとしてマークするなど、より簡単なソリューションを探していました(名前を変更します)その名前または一意のテキストに「処理済み」を追加し、次回は「処理済み」とマークされていないファイルを読み取ります。

このアプローチでは、フォルダーからすべてのファイルを読み取り、すべてのファイル名が「処理済み」で終わるかどうかを確認する必要があります。

私はjaveを初めて使用するので、それが可能かどうかわかりません.だから私の質問は、フォルダに存在するすべてのファイル名を反復せずに、「処理済み」で終わらないすべてのファイル名を照会できますか?

または誰かが他の解決策を持っていますか?

4

2 に答える 2

1

処理が完了したら、そのファイルはもう必要ですか? 誰がファイルを変更していますか? プログラム経由の場合、そのプログラムは既に処理されたファイルに関する情報を必要としますか? そのプログラムがファイルを変更しようとしているとき、ファイルの名前をfile1_processedからfile1に変更しますか?
ファイル名を変更する場合は、これらの使用例やその他の多くのことを考慮する必要があります (ただし、システムの詳細はわかりませんが、完全になると感じました)。 使い方は本当に簡単です
JNotifierこれを使用すると、実際にスケジューラを削除できます。特定のファイル (追加/変更など) に関する通知が来るたびに、実際にはその時点で特定のファイルのみについてのみデータベースを更新できます。フォルダーをトラバースする必要はありません。
JNotifier新しいファイルが追加されたとき、追加されたとき、変更されたとき、名前が変更されたとき、名前が変更されたとき、変更されたときなど、いくつかの場合に で複数の通知を受け取ることができることを確認してください。したがって、これらのことはあなたが世話をしなければなりません。
古いスケジューラでも同じことができます。ファイルの最終更新タイムスタンプをデータベースに保存できます。次のスケジュールでは、最新のタイムスタンプを確認するだけです。タイムスタンプが新しい場合は、それを処理してデータベースを再更新します。 また、スケジューラと
の混在も可能です。JNotifyjnotify により、一部の変更/変更されたファイル名を更新すると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
    }
于 2013-04-08T13:31:32.190 に答える