无法使用Java删除Azure上的文件

时间:2017-07-20 14:08:27

标签: java azure azure-web-sites delete-file ucanaccess

我在应用服务api-app上运行Azure上的Spring Boot REST应用程序。 我需要在azure" D:\ home \ site \ wwwroot \ database>"上读取此路径中的访问数据库文件。

当我从该位置读取文件时,我需要删除它们。

这是我从azure读取和删除文件的代码,但是当我转到 KUDU 调试控制台时,文件未被删除。

public  List<AccessFeedDTO> download(Long fileId) throws URISyntaxException, StorageException, IOException, SQLException{
    if(fileId!=null){
        File file = null;
    try {

        ImportFileFeedDTO importFileFeedDTO= importFileFeedService.getFeedFile(fileId);

        storageAccount = CloudStorageAccount.parse(storageConnectionString);
        CloudFileClient fileClient = storageAccount.createCloudFileClient();
        CloudFileShare share = fileClient.getShareReference("spartanv3files");
        CloudFileDirectory rootDir = share.getRootDirectoryReference();
        CloudFile cloudFile = rootDir.getFileReference(importFileFeedDTO.getFile_uuid());
        System.out.println(cloudFile.getName());
        System.out.println(cloudFile.downloadText());

        file = new File ("D:/home/database/"+importFileFeedDTO.getFile_uuid());
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        cloudFile.download(fileOutputStream);
        fileOutputStream.close();
        System.gc();



        List<AccessFeedDTO> accessFeedsDTOlist= accessFeedMapper.accessFeedEntitytolistofAccessFeedDTO(accessFeedRepository.getAllAccessFeeds(importFileFeedDTO.getFile_uuid()));
        file.delete();
        return accessFeedsDTOlist;
    } catch (InvalidKeyException invalidKey) {
        throw new RuntimeException(invalidKey.getMessage());

    }finally{
        file.delete();
    }
    }else{
        throw new RuntimeException();
    }
}

这就是我在azure上建立与该文件(访问数据库)的连接的方式。我使用UCanAccess连接到临时Access文件来读取数据。

public Connection getAccessFeedConnection(String fileName){

try {
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    connection = DriverManager.getConnection("jdbc:ucanaccess://D:/home/database/"+fileName+";immediatelyReleaseResources=true");
    return connection;
} catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    return connection;
}   
}

以下是我如何使用连接来访问来自访问数据库的参数

public List<AccessFeedEntity> getAllAccessFeeds(String dataBaseName) throws SQLException{
    Connection connection = accessConfig.getAccessFeedConnection(dataBaseName);
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT * FROM TBLFEEDS");
    try {
        List<AccessFeedEntity> listofaccessFeedEntity = new ArrayList<AccessFeedEntity>();
        while(resultSet.next()){

            AccessFeedEntity accessFeedEntity = new AccessFeedEntity();
            accessFeedEntity.setFeedid(resultSet.getLong("ID"));
            accessFeedEntity.setFeedname(resultSet.getString("NAME"));
            listofaccessFeedEntity.add(accessFeedEntity);

        }
        connection.close();
        statement.close();
        resultSet.close();
           return listofaccessFeedEntity;
    } catch (SQLException e) {
        connection.close();
        statement.close();
        resultSet.close();
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }finally{
        try {
            connection.close();
            statement.close();
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

当我尝试在 Kudu 调试控制台上删除该文件时,我收到以下消息&#34; 该进程无法访问该文件,因为它正由另一个进程使用。 &#34;

当我尝试在localhost文件上删除时。但是在Azure上没有用。

我哪里出错了,哪里没有关闭流?

或者有人可以帮助我以其他方式删除此文件吗?

1 个答案:

答案 0 :(得分:0)

尝试停止应用并在应用关闭时将其从Kudu中删除。