удаление папки / файла не работает при первом подключении к дерби - PullRequest
0 голосов
/ 01 ноября 2018

ОБНОВЛЕНИЕ: похоже, что system.exit (0) разблокирует файл и позволяет работать второму примеру кода. Как я могу разблокировать файл без вызова system.exit ()?

У меня есть два примера кода. Первый создает базу данных, закрывает соединение, а затем пытается удалить базу данных. Сбой при попытке удалить папку каталога.

Второй пример кода просто удаляет папку. Он работает и является тем же кодом, который использовался в первом примере кода.

Я думаю, что может быть какая-то проблема времени. Хотя соединение закрывается до того, как удаление произойдет в первом примере, мне интересно, если операция удаления не работает из-за некоторого скрытого соединения.

Первый пример кода:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.io.FileUtils;
import java.io.*;

public class DBtest{        
    public static void main(String[] args) {
        System.out.print('\u000C');
        String db = "test2";

        File file = new File(db);
        Connection conn = getDB(db);  

        try{ 
            if (conn != null) conn.close();
            System.out.println("connection closed " );
        }catch(SQLException e){
            System.out.println("connection NOT closed " + e);
            System.exit(0);
        }

        deleteDirectory(file);
        System.exit(0);

    }
    public static boolean deleteDirectory(File directoryToBeDeleted){
        File[] allContents = directoryToBeDeleted.listFiles();
        if (allContents != null) {
            for (File file : allContents) {           
               deleteDirectory(file);
            }
        }
        directoryToBeDeleted.setWritable(true);
        System.out.println(directoryToBeDeleted.toString());
        return directoryToBeDeleted.delete();
    }   

    public static Connection getDB(String database) {
        try{ 
            /* jdbc:derby specifies the driver to use to connect to the derby database
             * database is the name of the database we want to connect to.  A database can hold many tables
             * create=true is an option that creates and connects to the database if it does not exist, 
             * or just connect if it already exists.
             */ 

            File db =new File(database);            

            String URL = "jdbc:derby:" + database + ";create=true"; 

            System.out.println("db exists " + db.exists());

            Connection conn = DriverManager.getConnection(URL);            
            System.out.println("Succesfully connected to " + database);

            return conn;
        }catch(SQLException e){
            System.out.println("FATAL ERROR: from getDB " + e);

             return null;
        }   
    }    
}

Второй пример кода:

import org.apache.commons.io.FileUtils;
import java.io.*;
public class DirectoryDelete
{
    public static void main(String[] args){
        System.out.println('\u000C');
        File file = new File("test2");
        deleteDirectory(file);

    }

    public static boolean deleteDirectory(File directoryToBeDeleted){
        File[] allContents = directoryToBeDeleted.listFiles();
        if (allContents != null) {
           for (File file : allContents) {           
            deleteDirectory(file);
            }
        }
        directoryToBeDeleted.setWritable(true);
        System.out.println(directoryToBeDeleted.toString());
        return directoryToBeDeleted.delete();
    }
}

Что мне нужно сделать в первом примере, чтобы освободить папку / файлы, чтобы можно было их удалить?

1 Ответ

0 голосов
/ 01 ноября 2018

Ну, это заняло немало времени. Оказывается, вы должны закрыть базу данных, чтобы удалить папку. Закрытие соединения на самом деле не требуется, так как закрытие базы данных закроет все соединения. Просто вызовите DriverManager.getConnection("jdbc:derby:;shutdown=true"); и вы отправитесь в гонки.

...