【发布时间】:2021-04-13 15:59:19
【问题描述】:
我运行测试用例并将执行期间创建的文件保存在“执行”目录中(每个测试的文件在单独的子目录中) 在套件开始时我想清理这个文件夹
所以在 @BeforeSuite 方法中,我从“执行”目录中读取所有项目:
public static List<File> getRecursivelyAllFilesFromDirectory(String directory) throws IOException {
List<File> files = new ArrayList<>();
files.addAll(readAllFilesFromDirectory(directory));
List<File> subDirs = readSubdirectories(directory);
subDirs.forEach(dir -> {
try {
files.addAll(readAllFilesFromDirectory(dir.getPath()));
files.add(dir);
} catch (IOException e) {
e.printStackTrace();
}
});
return files;
}
然后我想删除所有内容
public static void cleanExecutionDirectory() throws IOException {
LOGGER.info("Cleaning execution directory...");
String executionDir = getExecutionDir();
List<File> files = FileUtils.getRecursivelyAllFilesFromDirectory(executionDir);
for (File file : files) {
file.delete();
}
LOGGER.info(String.format("%d items deleted", files.size()));
}
但是接下来在 @BeforeScenario 我尝试为新的执行创建具有相同名称的子文件夹
public static void setTestCaseDir(String testCaseName) throws IOException {
testCaseDir = testCaseName.split(StringUtils.SPACE)[0];
String executionDir = getExecutionDir();
Path testCaseDirPath = Paths.get(executionDir, testCaseDir);
boolean isSubDir = readSubdirectories(executionDir)
.stream()
.filter(subDir -> subDir.getPath().equals(testCaseDirPath))
.findFirst()
.isPresent();
if (!isSubDir) {
Files.createDirectory(testCaseDirPath);
}
testCaseDir = testCaseDirPath.toString();
}
我收到异常:
java.nio.file.AccessDeniedException: D:\...\src\test\resources\execution\TC01
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.createDirectory(WindowsFileSystemProvider.java:504)
at java.nio.file.Files.createDirectory(Files.java:674)
at utils.ExecutionUtils.setTestCaseDir(ExecutionUtils.java:56)
at integration.steps.StepDefs.beforeScenario(StepDefs.java:29)
尽管 setTestCaseDir 方法中的 readSubdirectories() 返回空列表,但还是会发生这种情况。 我在文件资源管理器中看到这个子目录是可见的,但我也无法访问它们。 当此执行由于此异常而失败时,此子文件夹将被解锁并消失。
什么进程可能会锁定这个子文件夹以及如何解决这个问题?
【问题讨论】:
-
你不显示
readSubdirectories,这是使用目录流吗? -
这是完整的堆栈跟踪吗?这里少了很多。显示
getExecutionDir()、readSubdirectories()、readAllFilesFromDirectory()以及出错时相关变量的值。 -
readSubdirs()返回文件是深度优先还是广度优先?如果没有看到我之前评论中列出的方法,我们可能无法帮助您。
标签: java file exception delete-file access-denied