我们多年来一直在Windows服务器上运行我们的Java代码。我们希望在一些FreeBSD盒子上运行相同的代码,但是我们的代码已经在一个环境中长大,在这种环境中,文件/路径名不区分大小写很长时间以致很多代码都会中断。
我想做的是某种技巧,我们将File或FileSystem子类化或类似技巧,这会强制我们所有文件名小写(始终)。
似乎很有可能(即使用新类OurFile扩展File,强制所有小写)。然后我们将运行一个脚本,将操作系统小写和bam上的所有文件/文件夹都打开,这些错误会被压扁。
似乎一些类似的黑客攻击和新的FileSystem实现也会产生良好的结果。
然后我想 - 肯定有人面对这个问题并且舔好了。
那么,那里的智慧是什么?是否有一种简单/标准的方法来解决这种区分大小写问题? (即有人写了LowerCaseFileSystemForPortingWindowsToUnix扩展FileSystem,并对其进行测试等。)答案 0 :(得分:0)
您是否考虑过修改代码?根据您的描述,您似乎有很多文件/资源引用,这些引用在代码中“不区分大小写”(简单地说,不正确)名称...可以通过调整文件名来引用它们的方式来完成代码(仅当代码中有一些后果时,fg所有文件名都是小写的)或调整代码中的常量以匹配文件名。
对java.io类的任何包装都需要列出路径中任何位置的所有文件/目录,并尝试查找与路径匹配的名称。但是,在U ** x系统上,您可以同时拥有resources
和Resources
目录等,那么您可以选择路径'RESOURCES / IMAGES / MYIMAGE.PNG'?此外,您将遇到I / O操作的性能问题。
我曾经'修复过'这样的项目,幸运的是它非常小,但它非常烦人。为了我的运气,一些操作可以编写脚本,例如将单个文件中的所有常量更改为小写,并将所有图像文件名的内容更低。
答案 1 :(得分:-2)
如果您的文件访问方法通过少量类(如new File(String filename)
),那么您可以使用AspectJ编织一些代码,这些代码会在文件传递时修改文件名的大小写。 / p>
类似的东西:
@Around(value = "newFile(context)", argNames = "point")
public Object requiresNew(ProceedingJoinPoint point) throws Throwable {
String filename = (String) point.getArgs()[0];
return point.proceed(new String[] { filename.toLowerCase() });
}
这可能会比扩展File
更少侵扰您的代码库,而且它会为您提供退出策略:
log.warn()
传递的所有文件名都不是完全小写的