title: can not delete my h2 database files with DeleteDbFiles.execute using java
body: <p>I want delete h2 database files with DeleteDbFiles.execute("./data", "mydb", false), but getting following error : <code>org.h2.message.DbException: Cannot delete file "dir/data/mydb.mv.db".</code>
  and <code>Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Cannot delete file "dir/data/mydb.mv.db".</code></p>
  
  <p>I tried to close EntityManager em (em.close()) and EntityManagerFactory emf (emf.close()) then delete files but still getting same error.
  I tried to delete @persistencecontext from mainForm but still getting same error.
  this is my codes:</p>
  
  <p>the main class:</p>
  
  <pre><code>import...
  
  public class Main {
  JalaliCalendar jalaliCalendar = new JalaliCalendar();
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit");
  List&lt;LoginEntity&gt; list = new ArrayList&lt;&gt;();
  
  public Main(){
      getData();
      interance();
  }
  
  public void interance(){
  
      if (!list.isEmpty()){
  
          LoginForm loginForm = new LoginForm(list);
          loginForm.setTitle("پنجره ورود");
          loginForm.setContentPane(loginForm.mainpane);
          loginForm.pack();
          loginForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          loginForm.setLocationRelativeTo(null);
          loginForm.setVisible(true);
  
      }else {
  
          Wellcome wellcome = new Wellcome();
          wellcome.setTitle("خوش آمدید");
          wellcome.setContentPane(wellcome.mainpane);
          wellcome.pack();
          wellcome.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          wellcome.setLocationRelativeTo(null);
          wellcome.setVisible(true);
  
      }
  }
  
  public void getData(){
      EntityManager em = emf.createEntityManager();
      em.getTransaction().begin();
      Query query = em.createQuery("from LoginEntity ");
      list = query.getResultList();
      em.getTransaction().commit();
      em.close();
  }
  public void getDiff(){
      JalaliCalendar j1 = new JalaliCalendar();
      j1.setYear(1398);
      j1.setMonth(3);
      j1.setDay(5);
  
      JalaliCalendar j2 = new JalaliCalendar();
      j2.setYear(1398);
      j2.setMonth(2);
      j2.setDay(5);
  
      jalaliCalendar.getMonth();
      jalaliCalendar.getDay();
      j1.getMonth();
      j1.getDay();
      int m = jalaliCalendar.getMonth() -  j1.getMonth();
      int d = jalaliCalendar.getDay() - j1.getDay();
      int dif = (m * 30) + d;
      System.out.println(dif);
      System.out.println(j1.getDateByDiff(dif));
  
  }
  
  public static void main(String[] args) {
      new Main();
  }
  }
  </code></pre>
  
  <p>my wellcome form:</p>
  
  <pre><code>import ...
  
  public class Wellcome extends JFrame{
  private JTextField tf_title;
  private JTextField tf_address;
  private JTextField tf_builders;
  private JRadioButton jb_yes;
  private JRadioButton jb_no;
  private JButton btn_next;
  public JPanel mainpane;
  private JPasswordField pf_p1;
  private JPasswordField pf_p2;
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit");
  List&lt;LoginEntity&gt; list = new ArrayList&lt;&gt;();
  
  public Wellcome() {
      btn_next.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent actionEvent) {
  
              saveData();
          }
      });
  }
  
  public void saveData(){
      String title = tf_title.getText();
      String address = tf_address.getText();
      boolean kind = false;
      if (jb_yes.isSelected()){
          kind = true;
      }else {
          kind = false;
      }
  
      String builders = tf_builders.getText();
      String p1 = String.valueOf(pf_p1.getPassword());
      String p2 = String.valueOf(pf_p2.getPassword());
      System.out.println(p1);
      System.out.println(p2);
      String pass = null;
  
      if (title.isEmpty() || address.isEmpty() || !jb_no.isSelected() &amp;&amp; !jb_yes.isSelected() || builders.isEmpty() || p1.isEmpty() || p2.isEmpty()){
          JOptionPane.showMessageDialog(null, "تمام بخش ها را کامل کنید");
      }else if (!p1.equals(p2)){
          JOptionPane.showMessageDialog(null, "رمز عبورها یکسان نیستند");
      }else{
          pass = p1;
          EntityManager em = emf.createEntityManager();
          em.getTransaction().begin();
          LoginEntity loginEntity = new LoginEntity();
          loginEntity.setTitle(title);
          loginEntity.setAddress(address);
          loginEntity.setKind(kind);
          loginEntity.setBuilders(builders);
          loginEntity.setPass(pass);
          em.persist(loginEntity);
          em.getTransaction().commit();
          em.close();
          list.add(loginEntity);
  
          LoginForm loginForm = new LoginForm(list);
          loginForm.setTitle("پنجره ورود");
          loginForm.setContentPane(loginForm.mainpane);
          loginForm.pack();
          loginForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          loginForm.setLocationRelativeTo(null);
          loginForm.setVisible(true);
  
          dispose();
      }
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>my login form:</p>
  
  <pre><code>import ...
  
  public class LoginForm extends JFrame{
  private JPasswordField pf_pass;
  private JButton btn_exit;
  private JButton btn_login;
  private JLabel lb_project;
  public JPanel mainpane;
  
  public static List&lt;LoginEntity&gt; list = new ArrayList&lt;&gt;();
  
  public LoginForm(List&lt;LoginEntity&gt; loginlist){
      list = loginlist;
      lb_project.setText(list.get(0).getTitle());
  
      btn_login.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent actionEvent) {
              Login();
          }
      });
      btn_exit.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent actionEvent) {
              //exit
              System.exit(0);
          }
      });
  }
  
  
  public void Login(){
      String pass = String.valueOf(pf_pass.getPassword());
      if (pass.equals(list.get(0).getPass())){
          MainForm mainForm = new MainForm(list);
          mainForm.setTitle("چرتکه");
          mainForm.setContentPane(mainForm.mainpane1);
          mainForm.pack();
          mainForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          mainForm.setLocationRelativeTo(null);
          mainForm.setExtendedState(JFrame.MAXIMIZED_BOTH);
          mainForm.setVisible(true);
          dispose();
  
      }else {
          JOptionPane.showMessageDialog(null, "رمزعبور معتبر نیست");
      }
  }
  </code></pre>
  
  <p>my main form:</p>
  
  <pre><code>import...
  
  @PersistenceContext
  public class MainForm extends JFrame {
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit");
  
  public JPanel mainpane1;
  public JTable table1;
  private JTextField tf_price;
  private JTextArea ta_detail;
  private JButton btn_save;
  private JButton btn_edit;
  private JButton btn_delete;
  private JFormattedTextField tf_date;
  private JComboBox cb_mycards;
  private JButton btn_addWorker;
  private JComboBox cb_yorcard;
  private JComboBox cb_title;
  private JButton btn_mycard_window;
  private JButton btn_addyorcards;
  private JTextField tf_search;
  private JLabel lb_sum;
  private JButton btn_print;
  private JLabel lb_part_sum;
  private JScrollPane mainscroll;
  private JPanel firstpanel;
  private JPanel secenodpanel;
  private JTable table2;
  private JLabel lb_builders;
  private JLabel lb_project;
  private JButton btn_calc;
  List&lt;PeymentsEntity&gt; PeymentList;
  List&lt;MycardsEntity&gt; MycardList;
  List&lt;WorkersEntity&gt; workers;
  List&lt;String&gt; WorkersNameList = new ArrayList&lt;&gt;();
  List&lt;YourcardsEntity&gt; numbers;
  JalaliCalendar jalaliCalendar = new JalaliCalendar();
  List&lt;LoginEntity&gt; list = new ArrayList&lt;&gt;();
  String res;
  String res2;
  
  public MainForm(List&lt;LoginEntity&gt; loginlist) {
      list = loginlist;
      int year = jalaliCalendar.getYear();
      int month = jalaliCalendar.getMonth();
      int day = jalaliCalendar.getDay();
      String m;
      String d;
  
      if (month &lt;= 9) {
          m = "0" + month;
      } else {
          m = String.valueOf(month);
      }
      if (day &lt;= 9) {
          d = "0" + day;
      } else {
          d = String.valueOf(day);
      }
      res = year + "/" + m + "/" + d;
      res2 = year + "-" + m + "-" + d;
      tf_date.setValue(res);
      btn_addWorker.setVisible(false);
      btn_addyorcards.setVisible(false);
      lb_project.setText(list.get(0).getTitle());
      lb_builders.setText(list.get(0).getBuilders());
      if (!list.get(0).isKind()) {
          //btn_calc.setVisible(false);
      }
      getPeymentData();
      getWorkers();
      FillMycardComboBox();
  
  
      btn_calc.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent actionEvent) {
  
              restore();
  
          }
      });
  }
  
  public void getPeymentData() {
  
      EntityManager em = emf.createEntityManager();
      em.getTransaction().begin();
      javax.persistence.Query query = em.createQuery("from PeymentsEntity ");
      PeymentList = query.getResultList();
      em.getTransaction().commit();
      em.close();
  
      int price = 0;
      for (PeymentsEntity p : PeymentList) {
          price += p.getPrice();
      }
  
      lb_sum.setText(String.valueOf(price));
  }
  
  public void getMycardData() {
  
      EntityManager em = emf.createEntityManager();
      em.getTransaction().begin();
      javax.persistence.Query query = em.createQuery("from MycardsEntity ");
      MycardList = query.getResultList();
      em.getTransaction().commit();
      em.close();
  }
  
  public void FillMycardComboBox() {
      for (MycardsEntity mc : MycardList) {
          cb_mycards.addItem(mc.getName());
      }
  }
  
  public void restore() {
  
      DeleteDbFiles.execute("./data", "mydb", false);
      System.out.println("deleted");
      try {
          RunScript.execute("./data/mydb", "", "", "./test.sql", null, false);
      }catch (SQLException e){
          e.printStackTrace();
      }
  }
  
  public void backup() {
  
      try {
          Backup.execute("name.zip", "./data","mydata", true );
      } catch (SQLException e) {
          e.printStackTrace();
      }
  
  }
  }
  </code></pre>
  
  <p>and my persistence.xml:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  
  &lt;persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
           version="2.1"&gt;
  
  &lt;persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL"&gt;
  &lt;provider&gt;org.hibernate.jpa.HibernatePersistenceProvider&lt;/provider&gt;
  &lt;class&gt;model.MycardsEntity&lt;/class&gt;
  &lt;class&gt;model.PeymentsEntity&lt;/class&gt;
  &lt;class&gt;model.WorkersEntity&lt;/class&gt;
  &lt;class&gt;model.YourcardsEntity&lt;/class&gt;
  &lt;class&gt;model.LoginEntity&lt;/class&gt;
  &lt;properties&gt;
      &lt;property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /&gt;
      &lt;property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./data/mydb;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO" /&gt;
      &lt;property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/&gt;
      &lt;property name="hibernate.show_sql" value="true"/&gt;
      &lt;property name="hibernate.format_sql" value="true"/&gt;
      &lt;property name="hbm2ddl.auto" value="update"/&gt;
  &lt;/properties&gt;
  </code></pre>
  
  <p></p>
  
  <p></p>
  
  <p>this is error after call restore() method:</p>
  
  <pre><code>Exception in thread "AWT-EventQueue-0" org.h2.message.DbException: Cannot delete file "D:/Java/hamid apps/IntellijProjects/JPADemo/data/mydb.mv.db" [90025-199]
  at org.h2.message.DbException.get(DbException.java:205)
  at org.h2.message.DbException.get(DbException.java:181)
  at org.h2.store.fs.FilePathDisk.delete(FilePathDisk.java:178)
  at org.h2.store.fs.FileUtils.delete(FileUtils.java:67)
  at org.h2.tools.DeleteDbFiles.process(DeleteDbFiles.java:106)
  at org.h2.tools.DeleteDbFiles.process(DeleteDbFiles.java:91)
  at org.h2.tools.DeleteDbFiles.execute(DeleteDbFiles.java:75)
  at MainForm.backup(MainForm.java:723)
  at MainForm$14.actionPerformed(MainForm.java:308)
  at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
  at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
  at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
  at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
  at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270)
  at java.desktop/java.awt.Component.processMouseEvent(Component.java:6589)
  at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
  at java.desktop/java.awt.Component.processEvent(Component.java:6354)
  at java.desktop/java.awt.Container.processEvent(Container.java:2261)
  at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4966)
  at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2319)
  at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
  at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4914)
  at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4543)
  at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4484)
  at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2305)
  at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
  at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
  at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
  at java.desktop/java.awt.EventQueue.access$600(EventQueue.java:97)
  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
  at java.base/java.security.AccessController.doPrivileged(Native Method)
  at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
  at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
  at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
  at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
  at java.base/java.security.AccessController.doPrivileged(Native Method)
  at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
  at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
  at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
  at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
  at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
  at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
  at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
  at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
  Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Cannot delete file "D:/Java/hamid apps/IntellijProjects/JPADemo/data/mydb.mv.db" [90025-199]
  at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
  at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
  ... 45 more
  </code></pre>