4

このコードでは、特定のパスのコンテンツの最新バージョンで HashMap を更新し、文字列としての絶対パスをキーとして使用することを望んでいます。問題は、WatchEvent.context()メソッドが、イベントごとに同じファイルに対して異なる相対パスを提供していることです。

コードのスニペットを次に示します。

            else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY)
            {
                /*Variable path is a Path of "//workspaces", set earlier.*/
                Path oldfilepath=path.resolve((Path)event.context()); /*problem line*/
                String oldfilepathstring = oldfilepath.toString();
                 FileReader oldIn = new FileReader(oldfilepathstring);
                 BufferedReader br = new BufferedReader(oldIn);
                 String line;
                 List<String> newfiletext=new LinkedList<>();
                  while((line = br.readLine())!=null)
                    newfiletext.add(line);

                 List<String> previousText=new LinkedList<>();
                 if((previousText = fileMappings.get(oldfilepathstring))!= null)
                 {
                      System.out.println("previoustext:\n"+previousText);
                      System.out.println("newfiletext:\n"+newfiletext);
                 }

                 fileMappings.put(oldfilepathstring, newfiletext);
                 System.out.println(fileMappings.keySet()+"\n"+fileMappings.values());
            }

        }

b.txt監視対象ディレクトリ内のファイルの内容を「abc」から「abc 123」に変更した場合の出力例を次に示します。

これはすべて、ファイル /workspaces/b.txt (既に存在する) を開いてその内容を変更するだけであることに注意してください。) :

    走る:
    ENTRY_CREATE:.goutputstream-BRC1HX
    ENTRY_MODIFY:.goutputstream-BRC1HX
    [/workspaces/.goutputstream-BRC1HX]
    [[]]
    ENTRY_MODIFY:.goutputstream-BRC1HX
    前のテキスト:
    []
    新しいファイルテキスト:
    [abc]
    [/workspaces/.goutputstream-BRC1HX]
    [[abc]]
    ENTRY_CREATE:b.txt~
    ENTRY_CREATE:b.txt
    ENTRY_CREATE:.goutputstream-MFJ6HX
    ENTRY_MODIFY:.goutputstream-MFJ6HX
    [/workspaces/.goutputstream-MFJ6HX、/workspaces/.goutputstream-BRC1HX]
    [[], [abc]]
    ENTRY_MODIFY:.goutputstream-MFJ6HX
    前のテキスト:
    []
    新しいファイルテキスト:
    [abc, 123]
    [/workspaces/.goutputstream-MFJ6HX、/workspaces/.goutputstream-BRC1HX]
    [[abc, 123], [abc]]
    ENTRY_CREATE:b.txt~
    ENTRY_CREATE:b.txt

気になるラインは Path oldfilepath=path.resolve((Path)event.context());

oldfilepath同じファイルが "/workspaces/.goutputstream-MFJ6HX" に解決され、その後 "/workspaces/.goutputstream-BRC1HX" に解決される方法に注意してください。

event.context()変更するたびに、同じファイルに対して異なるパスを返しています。これは Linux の問題ですか、それとも Java の問題ですか? また、このファイルの標準相対パス (この場合は "b.txt") を正確に取得するにはどうすればよいですか?

変更を実行すると、一連の作成/変更/作成イベントを取得しているようですENTRY_CREATE.sには正しいファイル名があり、ENTRY_MODIFYsには一時ハンドルがあります(ファイルの一時バージョンを推測しています)ファイルの変更をキャプチャし、そのイベントから正しいファイル名を取得できるようにする必要があります。

ファイルを開いたり、変更したり、保存したりするときに、ファイルシステムが内部で一時ファイルの作成と処理を行っている可能性があることは理解していますが、イベントを示す一時ファイルから適切なファイル名を正確に抽出するにはどうすればよいENTRY_MODIFYですか? この変更に関連するイベントをグループ化して、囲みENTRY_CREATEを見つけてそこからファイル名を取得できるようにする方法はありますか? または、どういうわけか、これにつながる呼び出しのスタックを上に移動しますENTRY_CREATEか?

ENTRY_CREATE各 を囲んでいる囲んでいるイベントでファイル名を見ることができますが、ENTRY_MODIFY何とかするよりもこれを行うためのよりエレガントな方法があることを願っています (そうではなかった最新のイベントを取得しENTRY_MODIFY、それから取得.context()します。)

ありがとう!

4

2 に答える 2