我的Web应用程序在Windows上运行。 我也想在Linux上运行我的应用程序。 我似乎已经克服了大部分的问题,如path分隔符等。
现在真正的问题是,当Java代码试图打开一个文件时,我得到FileNotFoundException
,只有当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); }
我没有编译这个代码,它可能有错别字和错误。 我让他们给你解决。