定位文件,而不考虑套管



我正在编写一个程序。然而,程序是我在一个基于Linux的操作系统上,它希望所有文件的名称大小写完全匹配,考虑到艺术家有一些用大写字母命名的,有些没有,有些有".png",有些是".png",还有一些是".png",等等;这正成为一项非常艰巨的任务。有一千多个精灵,或者重命名它们不会有问题。这是一个2D RPG爱好者项目,我正在做的学习,目的是我已经工作了一段时间。

无论如何,我的问题是,我们是否可以让"编译器"(我认为这是正确的说法)忽略文件结尾的字符大小写?如果我想加载以下项目

  • 1.jpg
  • 2.Jpg
  • 3.JPg
  • 4.JPG
  • 5.jpG

我希望能够在一行中完成。

不能让编译器忽略大小写;这是文件系统的一个特性。请注意,NTFS是不区分大小写的,但它是保留大小写的。

使用Java7,您可以使用DirectoryStream.Filter<Path>来收集相关路径;然后在适当的情况下重命名:

final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>()
{
    @Override
    public boolean accept(final Path entry)
    {
        return Files.isRegularFile(entry)
            && entry.getFileName().toString().toLowerCase().endsWith(".jpg");
    }
};
final List<Path> collected = new ArrayList<Path>();
try (
    final DirectoryStream<Path> entries = Files.newDirectoryStream(dir, filter);
) {
    for (final Path entry: entries)
        collected.add(entry);
}
Path dst;
String targetName;
for (final Path src: collected) {
    targetName = src.getFileName().toString().toLowerCase();
    dst = src.resolveSibling(targetName);
    if (!Files.isSameFile(src, dst))
        Files.move(src, dst, StandardCopyOption.ATOMIC_MOVE);
}

对于Java8,您可能会使用Files.walk()和lambdas。

如果您知道文件的确切目录,则可以使用File.list()获取该目录中所有文件的String[]。通过对这些文件进行迭代并在文件名上使用toLowerCase(),您可以找到所需的文件。

String filename = "1.jpg";
String targetFilename = null;
File directory = new File("/some/path");
for(String maybeTargetName : directory.list()) {
    if(filename.equals(maybeTargetName.toLowerCase()) {
        targetFilename = maybeTargetName;
        break;
    }
}
if(targetFilename != null) {
    File targetFile = new File(directory, targetFilename);
}

相关内容

  • 没有找到相关文章

最新更新