Files.walk标识文件是来自子文件夹还是主文件夹

时间:2018-03-09 12:43:14

标签: java filter stream

我终于让我的Files.walk工作了我的问题是,如果有任何方法可以确定收集到列表中的文件是来自子文件夹还是主文件夹,因为这些文件有删除功能但子文件中的文件用户不应该删除的文件夹。

 private static List<FileInfo> listBackupFilesInLocalDir(String localPath, Predicate<String> fileNamePredicate) {
    try (Stream<Path> files = Files.walk(Paths.get(localPath))) {
        return files.filter(p -> fileNamePredicate.test(p.getFileName().toString()))
                    .map(p -> new FileInfo(p.getFileName().toString(), p.toFile().length()))
                    .sorted()
                    .collect(toList());
    } catch (IOException e) {
        log.error("Error listing directories", e);
        throw new RuntimeException(e);
    }
}

这是找到并收集所有文件的功能。它是我需要的某种过滤器,还是可以做我想要的?

  deleteLocalFile.addClickListener(event -> {
        try {
            Files.delete(Paths.get(this.localStorage, String.valueOf(localFilesComboBox.getValue())));
        } catch (IOException e) {
            UI.getCurrent().access(() -> Notification.show(e.getMessage(), Notification.Type.ERROR_MESSAGE));
        }

        UI.getCurrent().access(() -> {
            localFilesComboBox.removeAllItems();
            localFilesComboBox.addItems(listBackupFiles());
        });
    });

以上是删除方法,我想要的只是一个if(来自文件夹a){ 否认删除 }

或类似的东西

2 个答案:

答案 0 :(得分:1)

好的,所以你希望只能删除主文件夹中的文件和文件,而不能删除子文件夹中的文件。因此,您需要主文件夹中的文件列表。您可以通过检查FileInfo方法结果中listBackupFilesInLocalDir个对象的网址来执行此操作。这可以通过以下方式完成:

public ArrayList<FileInfo> filesInMainFolder(string mainPath,
                                         ArrayList<FileInfo> files) {
    ArrayList<FileInfo> res = new ArrayList<FileInfo>();

    for (FileInfo info : files) {
        String url = info.getUrl().toString();
        // Get the path of the File for which we have file information
        url = url.substring(0, url.lastIndexOf('/'));

        // Is file in the main folder
        if (url.compareTo(mainPath) == 0 && info.isDirectory() == false) {

            res.add(info);
        }
    }
    return res;
}

该方法应该很容易理解。我在这里没有包含的选项是URL上的getUrl()方法,因为我不是100%确定它是如何工作的。如果它获取了目录路径,请使用该路径并将转换拖放到网址的字符串,然后只使用info.getUrl().getPath()

答案 1 :(得分:0)

要知道您相对于localPath的深度,您可以计算路径中元素的数量。像这样:

int mainFolderDepth = Paths.get(localPath).toRealPath().getNameCount();

//in your stream
int folderDepth = p.toRealPath().getNameCount();
if (! Files.isDirectory(p)) folderDepth--; //don't count the file name
if (folderDepth != mainFolderDepth) { /* not in main folder */ }

或者,在文件遍历中,如果要通过将maxDepth参数设置为1来忽略它们,请确保不要输入子文件夹。