2014-04-16 26 views
1

我正在開發一個程序。然而,該程序是我在基於Linux的操作系統上,它希望所有文件都有完美的大小寫匹配名稱,並且考慮到藝術家有一些用Caps命名,有些沒有,有些是「.png」 「.Png」和一些是「.PNG」等;這成爲一項非常困難的任務。有一千多個Sprites,或重命名他們不會是一個問題。這是一個我正在學習的2D RPG Hobby項目,目前我一直在研究一段時間。找到一個文件而不管外殼?

無論如何,我的問題是如果我們可以使'編譯器'(我認爲是正確的方式來說這個)忽略文件結尾字符 - 套管?如果我要加載以下項目

  • 1.JPG
  • 2.JPG
  • 3.JPG
  • 4.JPG
  • 5.JPG

我想能夠在一條線上完成。

+1

製作一個將所有文件重命名爲相同(即小寫)的腳本。這是一個聰明的解決方案。 – Kayaman

回答

0

如果您知道文件的確切目錄,您可以使用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); 
} 
1

你不能讓編譯器忽略大小寫;這是一個文件系統的特點。請注意,NTFS不區分大小寫,但仍然保留個案。

使用Java 7,您可以使用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); 
} 

與Java 8可能會使用Files.walk()和lambda表達式來代替。

+0

不錯的解決方案。我對'accept()'方法做了一個快速修改:'return matcher.matches(entry.getFileName());'。並添加了'private static final PathMatcher matcher = FileSystems.getDefault()。getPathMatcher(「regex:。*(?i:jpg | jpeg)」);'。這使得檢查多個擴展和不區分大小寫變得容易。 – mateuscb