2015-07-09 2 views
0

Так что я должен сделать программу в java, которая автоматически запускается в фоновом режиме и ищет новый .dat-файл, и когда он видит новый .dat-файл, тогда он запускает .bat-файл для загрузки данных в базу данных. Пока у меня есть программа, которая следит за новым созданием, модификацией и удалением файлов. У меня также есть скрипт, который запускает .bat-файл и загружает данные в базу данных. Теперь мне просто нужно соединить два, но я не уверен, как это сделать. Если кто-то может указать мне в правильном направлении, я бы очень признателен Это.Возможно ли запустить цикл при создании нового файла в папке?

Ниже приведен код, который у меня есть.

import static java.nio.file.LinkOption.NOFOLLOW_LINKS; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; 
import static java.nio.file.StandardWatchEventKinds.OVERFLOW; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 

import java.io.*; 
import java.util.*; 
import java.io.File; 
import java.io.IOException; 
import java.nio.file.FileSystem; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.WatchEvent; 
import java.nio.file.WatchEvent.Kind; 
import java.nio.file.WatchKey; 
import java.nio.file.WatchService; 


public class Order_Processing { 

    public static void watchDirectoryPath(Path path) 
    { 
     try { 
      Boolean isFolder = (Boolean) Files.getAttribute(path, 
        "basic:isDirectory", NOFOLLOW_LINKS); 
      if (!isFolder) 
      { 
       throw new IllegalArgumentException("Path: " + path 
         + " is not a folder"); 
      } 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
     System.out.println("Watching path: "+ path); 
     FileSystem fs = path.getFileSystem(); 
     try (WatchService service = fs.newWatchService()) 
     { 
      path.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE); 
      WatchKey key = null; 
      while (true) 
      { 
       key = service.take(); 

       Kind<?> kind = null; 
       for (WatchEvent<?> watchEvent : key.pollEvents()) 
       { 
        kind = watchEvent.kind(); 
        if (OVERFLOW == kind) 
        { 
         continue; 
        } 
        else if (ENTRY_CREATE == kind) 
        { 
         Path newPath = ((WatchEvent<Path>) watchEvent) 
           .context(); 
         System.out.println("New Path Created: " + newPath); 
        } 
        else if (ENTRY_MODIFY == kind) 
        { 
         Path newPath = ((WatchEvent<Path>) watchEvent) 
           .context(); 
         System.out.println("New path modified: "+ newPath); 
        } 
        else if (ENTRY_DELETE == kind) 
        { 
         Path newPath = ((WatchEvent<Path>) watchEvent) 
           .context(); 
         System.out.println("New path deleted: "+ newPath); 
        } 
       } 
       if (!key.reset()) 
       { 
        break; 
       } 
      } 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
     catch (InterruptedException ie) 
     { 
      ie.printStackTrace(); 
     } 
    } 

public static void main(String[] args) 
          throws FileNotFoundException 
{ 
    File dir = new File("C:\\Paradigm"); 
    watchDirectoryPath(dir.toPath()); 

    //below is the script that runs the .bat file and it works if by itself 
    //with out all the other watch code. 
    try { 
     String[] command = {"cmd.exe", "/C", "Start", "C:\\Try.bat"}; 
     Process p = Runtime.getRuntime().exec(command);   
    } 
    catch (IOException ex) { 
    } 
    } 
} 
+0

Таким образом, вы должны знать, как управлять .bat-файл и передать ему некоторые аргументы? – crush

+0

Почему бы не вызвать командный файл в событии, а не после возврата из watchDirectoryPath? Разве это не будет работать только один раз? Это все, что вам нужно? Я пытаюсь выяснить, что именно вы спрашиваете. Можете ли вы описать больше о том, что означает «соединить два» в вашем контексте? – crush

+0

Просто поместите код, который запускает файл '.BAT', где вы распечатываете новый файл. – Holger

ответ

0

Это не работает, потому что у вас есть while (true). Это имеет смысл, потому что вы слушаете и хотите, чтобы это происходило непрерывно; однако вызов летучей мыши никогда не будет выполнен, потому что watchDirectory(...) никогда не завершится. Чтобы решить эту проблему, вытащить остальную часть магистрали из в свою собственную функцию, как так

public static void executeBat() { 
    try { 
     String[] command = {"cmd.exe", "/C", "Start", "C:\\Try.bat"}; 
     Process p = Runtime.getRuntime().exec(command); 
    } 
    catch (IOException ex) { 
     // You should do something with this. 
     // DON'T JUST IGNORE FAILURES 
    } 

так, что при создании файла, вы можете позвонить, что летучей мыши сценарий

... 
else if (ENTRY_CREATE == kind) 
{ 
    Path newPath = ((WatchEvent<Path>) watchEvent).context(); 
    executeBat(); 
} 
... 
Смежные вопросы