我有一個程序監視目錄中的任何更改。文件路徑對於java中的路徑對象不正確
這是程序的輸出。
C:\REST API\source\data_id.txt
The new file :data_id.txtEvent :ENTRY_CREATE
C:\REST API\source\New folder
The new file :New folderEvent :ENTRY_CREATE
C:\REST API\source\NhuPhutBanDau-NooPhuocThinh-4549467.doc
The new file :NhuPhutBanDau-NooPhuocThinh-4549467.docEvent :ENTRY_CREATE
我的程序監視根目錄C:/REST API/source
的任何更改。當我將data_id.txt
文件複製到根目錄時,它可以檢測到新文件,如上面的輸出和目錄中所示。
之後,當我嘗試創建一個文件夾時,它也能夠檢測到有一個新文件夾並在輸出中顯示新文件夾目錄。
但問題是,當我嘗試將文件放入新創建的文件夾時,它再次能夠檢測到新文件夾C:\REST API\source\New folder
中的更改,該文件夾不是我的程序中設置的根目錄C:\REST API\source
。
我需要程序檢測只在根目錄中的更改。
有人可以指導我嗎?
這是我的源代碼:
public class fileStatus {
private final WatchService svc = null;
private final HashMap<WatchKey , Path> keyMap = null;
public static void main(String [] args) throws FileNotFoundException, IOException, JSONException, InterruptedException
{
try(WatchService svc = FileSystems.getDefault().newWatchService())
{
Map<WatchKey, Path> keyMap = new HashMap<>();
Path path = Paths.get("C:/REST API/source/");
fileStatus fs = new fileStatus();
fs.registerAll(path,keyMap,svc);
WatchKey wk ;
do
{
wk = svc.take();
Path dir = keyMap.get(wk);
for(WatchEvent<?> event : wk.pollEvents())
{
WatchEvent.Kind<?> type = event.kind();
Path fileName = (Path)event.context();
Path child = path.resolve(fileName);
System.out.println(child);
if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS))
{
if(type == StandardWatchEventKinds.ENTRY_CREATE)
{
registerAll(child,keyMap,svc);
}
}
System.out.println("\nThe new file :"+fileName+ "Event :" +type);
}
}while(wk.reset());
}
catch(IOException e)
{
e.printStackTrace();
}
}
private static void registerAll(Path path, Map<WatchKey, Path> keyMap, WatchService svc) throws IOException
{
Files.walkFileTree(path,new SimpleFileVisitor<Path>()
{
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs) throws IOException
{
if(attrs.isDirectory())
{
keyMap.put(path.register(svc, StandardWatchEventKinds.ENTRY_CREATE),path);
}
return FileVisitResult.CONTINUE;
}
});
}
}
* Java編譯器*當然不會顯示該輸出。 *您的程序*是。 – Andreas
問自己這個問題:keyMap的目的是什麼? – Andreas
用於註冊觀察者服務和事件 – attack