我的 Web 应用程序在 Windows 上运行。我也想在 Linux 上运行我的应用程序。我似乎已经克服了大部分问题,例如路径分隔符等。
现在真正的问题是FileNotFoundException
当Java代码试图打开一个文件Abc.txt
时说只abc.txt
存在时我得到了。:(
我不能继续将所有文件名更改为小写或大写,因为我有很多文件。在不更改代码的情况下,有任何可能的方法来避免这种情况吗?
我的 Web 应用程序在 Windows 上运行。我也想在 Linux 上运行我的应用程序。我似乎已经克服了大部分问题,例如路径分隔符等。
现在真正的问题是FileNotFoundException
当Java代码试图打开一个文件Abc.txt
时说只abc.txt
存在时我得到了。:(
我不能继续将所有文件名更改为小写或大写,因为我有很多文件。在不更改代码的情况下,有任何可能的方法来避免这种情况吗?
修理它!
从长远来看,您为规避修复而设计的任何方案都会变得更糟。
java.io.File
由于API 依赖于系统,因此无法避免这种情况。在 Linux/Unix 上操作文件时必须使用正确的大小写。实际上,我的建议/解决方案是在 Windows 上开发期间遵循严格且可移植的约定(例如,仅使用小写文件名,或者更好的是,在以编程方式访问文件时使用确切的文件名)。老实说,我不明白为什么Abc.txt
当文件名是abc.txt
. 这是一个坏习惯(通过在 Windows 上花费太多时间来养成)而不是 Linux/Unix 问题。
好吧,首先我认为您应该考虑使用一致的命名方案,而不是使用一些解决方法。
无论如何,如何读取所有文件名并将它们放入包含小写名称作为键的映射中?然后,您可以从地图中查找正确的文件名。
这也允许您检测冲突,例如同一目录中的两个文件“FileA.txt”和“FILEA.TXT”具有相同的小写表示,在这种情况下,您知道您必须解决问题一种完全不同的方式(因为你必须知道你想打开哪个,而且它是模棱两可的,这样的解决方法不会这样做)。
假设文件在 Linux 上是大小写混合的,对此没有简单的答案。
我能想到的最好的办法是让您的应用程序列出相关目录并创建实际 Linux 文件名的内存数据结构。然后打开不区分大小写的文件,将路径名拆分为组件,使用不区分大小写的搜索搜索内存树,构建真实(区分大小写)路径名并使用 THAT 来打开文件。
这样做的问题是它(实际上是你的应用程序)无法应对在同一个 Linux 目录中有(比如)“foo.txt”和“Foo.txt”的情况。
但最好的解决方案是更改您的应用程序,使其与区分大小写的路径名一起使用。
为什么不能更改很多文件?如果文件的数量确实是唯一让您望而却步的事情,那么只需编写一个小脚本,将它们全部重命名为小写即可。
从您的问题中不清楚是什么导致了您的文件的大小写变化。如果您的所有文件在 linux 中都是小写,而在 Windows 上是混合大小写,您可以将文件名转换为小写,如下所示:
new File(filename.toLowerCase())
有一个解决方案的运行时性能很差,但实现起来非常简单:
new FileReader(name)
用类似的东西替换
openFile(name);
public FileReader openFile(String name) throws FileNotFoundException {
File dir = (new File(name)).getParentFile();
for (File f : dir.listFiles()) {
if (f.getName().equalsIgnoreCase(name)) {
return new FileReader(f);
}
throw new FileNotFoundException("File not found: " + name);
}
我还没有编译这段代码,它可能有错别字和错误。我把它们留给你修复。