我正在编写一个程序。然而,程序是我在一个基于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);
}