5

我的 Web 应用程序在 Windows 上运行。我也想在 Linux 上运行我的应用程序。我似乎已经克服了大部分问题,例如路径分隔符等。

现在真正的问题是FileNotFoundException当Java代码试图打开一个文件Abc.txt时说只abc.txt存在时我得到了。:(

我不能继续将所有文件名更改为小写或大写,因为我有很多文件。在不更改代码的情况下,有任何可能的方法来避免这种情况吗?

4

7 回答 7

4

修理它!

从长远来看,您为规避修复而设计的任何方案都会变得更糟。

于 2009-11-14T09:50:30.263 回答
3

java.io.File由于API 依赖于系统,因此无法避免这种情况。在 Linux/Unix 上操作文件时必须使用正确的大小写。实际上,我的建议/解决方案是在 Windows 上开发期间遵循严格且可移植的约定(例如,仅使用小写文件名,或者更好的是,在以编程方式访问文件时使用确切的文件名)。老实说,我不明白为什么Abc.txt当文件名是abc.txt. 这是一个坏习惯(通过在 Windows 上花费太多时间来养成)而不是 Linux/Unix 问题。

于 2009-11-14T09:27:51.477 回答
2

好吧,首先我认为您应该考虑使用一致的命名方案,而不是使用一些解决方法。

无论如何,如何读取所有文件名并将它们放入包含小写名称作为键的映射中?然后,您可以从地图中查找正确的文件名

这也允许您检测冲突,例如同一目录中的两个文件“FileA.txt”和“FILEA.TXT”具有相同的小写表示,在这种情况下,您知道您必须解决问题一种完全不同的方式(因为你必须知道你想打开哪个,而且它是模棱两可的,这样的解决方法不会这样做)。

于 2009-11-14T09:27:21.583 回答
1

假设文件在 Linux 上是大小写混合的,对此没有简单的答案。

我能想到的最好的办法是让您的应用程序列出相关目录并创建实际 Linux 文件名的内存数据结构。然后打开不区分大小写的文件,将路径名拆分为组件,使用不区分大小写的搜索搜索内存树,构建真实(区分大小写)路径名并使用 THAT 来打开文件。

这样做的问题是它(实际上是你的应用程序)无法应对在同一个 Linux 目录中有(比如)“foo.txt”和“Foo.txt”的情况。

但最好的解决方案是更改您的应用程序,使其与区分大小写的路径名一起使用。

于 2009-11-14T09:31:40.830 回答
1

为什么不能更改很多文件?如果文件的数量确实是唯一让您望而却步的事情,那么只需编写一个小脚本,将它们全部重命名为小写即可。

于 2009-11-14T10:10:35.343 回答
0

从您的问题中不清楚是什么导致了您的文件的大小写变化。如果您的所有文件在 linux 中都是小写,而在 Windows 上是混合大小写,您可以将文件名转换为小写,如下所示:

new File(filename.toLowerCase())
于 2009-11-14T09:25:14.150 回答
0

有一个解决方案的运行时性能很差,但实现起来非常简单:

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);
}

我还没有编译这段代码,它可能有错别字和错误。我把它们留给你修复。

于 2009-11-14T09:37:18.893 回答