检查资源是否已存在且具有不同的大小写

时间:2015-03-23 13:16:18

标签: java eclipse eclipse-plugin

在向导中,我正在创建一个包并尝试检查资源是否已存在,并且具有不同的大小写以避免ResourceException引发org.eclipse.core.internal.resources.Resource#checkDoesNotExist。例如,当我尝试创建包com.Example.test而com.example.test已经存在时,我得到了这个异常。所以我想检查一下包名的每个部分。现有com.Example.test的情况已在我的代码中处理。

由于方法checkDoesNotExist位于内部类中而未由IResource声明,因此它不在公共API中,我无法在调用{{1}之前使用它进行检查}。方法IFolder#create在这种情况下是无用的,因为它区分大小写。

目前我有以下解决方案:

IResource#exists

关于此解决方案的问题是它只能在Windows上运行,因为/** * This method checks if a package or its part exists in the given source folder with a different case. * * @param pfr A source folder where to look package in. * @param packageName Name of the package, e.g. "com.example.test" * @return A String containing path of the existing resource relative to the project, null if the package name has no conflicts. * @throws CoreException * @throws IOException */ public static String checkPackageDoesExistWithDifferentCase(IPackageFragmentRoot pfr, String packageName) throws CoreException, IOException { IPath p = pfr.getResource().getLocation(); String[] packagePathSegments = packageName.split("\\."); for (int i = 0; i < packagePathSegments.length; i++) { p = p.append(packagePathSegments[i]); File f = new File(p.toString()); String canonicalPath = f.getCanonicalPath(); if (f.exists() && !canonicalPath.equals(p.toOSString())) return canonicalPath.substring(pfr.getJavaProject().getResource().getLocation().toOSString().length() + 1); } return null; } 会在区分大小写的文件系统上返回f.exists()

1 个答案:

答案 0 :(得分:0)

正如您所指出的,没有API,但如果父资源的成员具有相同(不区分大小写)的名称,则可以检查父资源:

IContainer parent = newFolder.getParent();
IResource[] members = parent.members();
for( IResource resource : members ) {
  if( resource.getName().equalsIgnoreCase( newFolder.getName() ) ) {
    ...
  }
}