在向导中,我正在创建一个包并尝试检查资源是否已存在,并且具有不同的大小写以避免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()
。
答案 0 :(得分:0)
正如您所指出的,没有API,但如果父资源的成员具有相同(不区分大小写)的名称,则可以检查父资源:
IContainer parent = newFolder.getParent();
IResource[] members = parent.members();
for( IResource resource : members ) {
if( resource.getName().equalsIgnoreCase( newFolder.getName() ) ) {
...
}
}