将Java应用程序从不区分大小写的文件系统移动到区分大小写的文件系统

时间:2012-02-22 01:58:16

标签: java windows linux case

我们多年来一直在Windows服务器上运行我们的Java代码。我们希望在一些FreeBSD盒子上运行相同的代码,但是我们的代码已经在一个环境中长大,在这种环境中,文件/路径名不区分大小写很长时间以致很多代码都会中断。

我想做的是某种技巧,我们将File或FileSystem子类化或类似技巧,这会强制我们所有文件名小写(始终)。

似乎很有可能(即使用新类OurFile扩展File,强制所有小写)。然后我们将运行一个脚本,将操作系统小写和bam上的所有文件/文件夹都打开,这些错误会被压扁。

似乎一些类似的黑客攻击和新的FileSystem实现也会产生良好的结果。

然后我想 - 肯定有人面对这个问题并且舔好了。

那么,那里的智慧是什么?是否有一种简单/标准的方法来解决这种区分大小写问题? (即有人写了LowerCaseFileSystemForPortingWindowsToUnix扩展FileSystem,并对其进行测试等。)

2 个答案:

答案 0 :(得分:0)

您是否考虑过修改代码?根据您的描述,您似乎有很多文件/资源​​引用,这些引用在代码中“不区分大小写”(简单地说,不正确)名称...可以通过调整文件名来引用它们的方式来完成代码(仅当代码中有一些后果时,fg所有文件名都是小写的)或调整代码中的常量以匹配文件名。

对java.io类的任何包装都需要列出路径中任何位置的所有文件/目录,并尝试查找与路径匹配的名称。但是,在U ** x系统上,您可以同时拥有resourcesResources目录等,那么您可以选择路径'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更少侵扰您的代码库,而且它会为您提供退出策略:

  1. log.warn()传递的所有文件名都不是完全小写的
  2. 修复出现的警告
  3. 中填充后移除方面