miniWorld
miniWorld

Reputation: 37

Files.delete did not delete the folder correctly

In the springboot project, after the files have been merged, they need to be deleted. The main code for the merge method is:

// chunkFolder indicates the file storage folder path
Files.list(Paths.get(chunkFolder))
                .filter(path -> path.getFileName().toString().contains(HYPHEN))
                .sorted((p1, p2) -> {
                    String fileName1 = p1.getFileName().toString();
                    String fileName2 = p2.getFileName().toString();
                    int index1 = fileName1.indexOf(HYPHEN);
                    int index2 = fileName2.indexOf(HYPHEN);
                    return Integer.valueOf(fileName1.substring(0, index1)).compareTo(Integer.valueOf(fileName2.substring(0, index2)));
                })
                .forEach(path -> {
                            try {
                                Files.write(Paths.get(target), Files.readAllBytes(path), StandardOpenOption.APPEND);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                );

The delete method is:

 public void deleteDirectory(Path targetPath) throws IOException {
        Files.walk(targetPath).sorted(Comparator.reverseOrder()).forEach(path -> {
            try {
                Files.delete(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

In the windows environment test, delete the storage path after merging. However, the results show that the folder still exists, but cannot be accessed. If you stop the springboot project, the folder disappears.

Upvotes: 0

Views: 42

Answers (1)

DuncG
DuncG

Reputation: 15196

This problem happens on Windows when you are not closing all the directory streams correctly. You must close all directory streams scanned in your code. The two examples you've shown can be fixed with try with resources:

try(Stream<Path> stream = Files.list( ... )) {
    ... your code
    stream.xyz(...);
}

... plus same for Files.walk() in deleteDirectory. Check other similar calls in all code.

When this occurs the directory is in a strange state when viewed in Windows Explorer - visible but not accessible. Shutting down the VM clears up correctly and the folder disappears from Explorer.

Upvotes: 1

Related Questions