查找移动到不同位置的文件的新位置 - Java
to find new location of files that are moved to different location - Java
我在旧版本的应用程序中有一个包含 header 个文件的文件夹。
该文件夹和许多子文件夹中直接有许多 header 文件...现在我们将使用更新版本的应用程序,其中 header 文件路径存在于与它们不同的子文件夹中以前是。我想写一个 java 程序(最好),它给我一个旧路径和 header 的新路径的一对一映射。我在两个版本中都有 header 文件的根目录...我想找到 header 文件路径相对于根目录的差异。
Header files 旧版本根目录:Root1
Header 新版本文件根目录:Root2
Root1 下考虑有三个子文件夹:Folder1、Folder2、Folder3
Root2 下考虑有三个子文件夹:Folder1、Folder2、Folder3
在Root1/Folder1下有三个文件:File1,File2,File3
Root1/Folder1/File1,
Root1/Folder1/File2,
Root1/Folder1/File3.
现在在新版本中,这些文件如下:
Root2/Folder1/File1,
Root2/Folder2/File3,
Root2/Folder3/File2.
文件已重组。
我想编写一个程序通过扫描两个根文件夹来找出这些文件的新版本路径:
所需输出:
Root1/Folder1/File1 = Root2/Folder1/File1
Root1/Folder1/File2 = Root2/Folder3/File2
Root1/Folder1/File3 = Root2/Folder2/File3.
对不起,如果我不清楚。如果我们在编程中遇到任何问题,SO 是一个参考站点。出于对这种逻辑的想法,我被这个 运行 困住了。请帮助。
编辑 1:
抱歉耽搁了..两个版本的文件名相同。让我告诉要求。在整个项目中,包含了数百个 header 文件引用旧版本......它的基于 c 和 cpp 的代码。现在我们需要根据新的 header 路径更改所有包含语句的代码。因此,通过 windows 资源管理器逐一搜索手动更改是乏味的。 header 文件是否已更改并不重要。新的功能定义可能已添加到新版本中。但我们需要包含相同的 header 文件。
此程序可能会节省大量人工时间。谢谢:)
假设它们的名字相同,
您可以:
File oldH = "/";
For (path:oldH) {
// Map<fname,dir> odb=path;
File newH = "/new/";
For (path:newH)
// Map<fname,dir> ndb=path;
Array newarray[]=ndb.size();
While(odb.hasNext()) {
While (ndb.hasNext()) {
If (odb.fname.next()==ndb.fname.next()) {
newarray[i][0]= odb.path;
newarray[i][1]= ndb.path;
break;
}
i++;
}
这只是伪代码,但希望对您有所帮助。
这假设文件名在从一个目录树迁移到另一个目录树的过程中没有改变。
这是快速而肮脏的,缺少所有完整性检查和错误处理,但它说明了要点:递归下降到目录以收集文件以收集文件名到路径的映射。 comp 方法仅从第一个目录树中获取名称并显示两个目录树中的路径名。
public void find( File root, Map<String, String> map ){
File[] entries = root.listFiles();
for( File file: entries ){
if( file.isDirectory() ){
find( file, map );
} else {
map.put( file.getName(), file.getAbsolutePath() );
}
}
}
public void comp( File root1, File root2 ){
Map<String,String> map1 = new HashMap<>();
find( root1, map1 );
Map<String,String> map2 = new HashMap<>();
find( root2, map2 );
for( String name1: map1.keySet() ){
String path1 = map1.get( name1 );
String path2 = map2.get( name1 );
System.out.println( name1 + ": " + path1 + "->" + path2 );
}
}
我在旧版本的应用程序中有一个包含 header 个文件的文件夹。 该文件夹和许多子文件夹中直接有许多 header 文件...现在我们将使用更新版本的应用程序,其中 header 文件路径存在于与它们不同的子文件夹中以前是。我想写一个 java 程序(最好),它给我一个旧路径和 header 的新路径的一对一映射。我在两个版本中都有 header 文件的根目录...我想找到 header 文件路径相对于根目录的差异。
Header files 旧版本根目录:Root1
Header 新版本文件根目录:Root2
Root1 下考虑有三个子文件夹:Folder1、Folder2、Folder3
Root2 下考虑有三个子文件夹:Folder1、Folder2、Folder3
在Root1/Folder1下有三个文件:File1,File2,File3
Root1/Folder1/File1,
Root1/Folder1/File2,
Root1/Folder1/File3.
现在在新版本中,这些文件如下:
Root2/Folder1/File1,
Root2/Folder2/File3,
Root2/Folder3/File2.
文件已重组。 我想编写一个程序通过扫描两个根文件夹来找出这些文件的新版本路径:
所需输出:
Root1/Folder1/File1 = Root2/Folder1/File1
Root1/Folder1/File2 = Root2/Folder3/File2
Root1/Folder1/File3 = Root2/Folder2/File3.
对不起,如果我不清楚。如果我们在编程中遇到任何问题,SO 是一个参考站点。出于对这种逻辑的想法,我被这个 运行 困住了。请帮助。
编辑 1:
抱歉耽搁了..两个版本的文件名相同。让我告诉要求。在整个项目中,包含了数百个 header 文件引用旧版本......它的基于 c 和 cpp 的代码。现在我们需要根据新的 header 路径更改所有包含语句的代码。因此,通过 windows 资源管理器逐一搜索手动更改是乏味的。 header 文件是否已更改并不重要。新的功能定义可能已添加到新版本中。但我们需要包含相同的 header 文件。
此程序可能会节省大量人工时间。谢谢:)
假设它们的名字相同,
您可以:
File oldH = "/";
For (path:oldH) {
// Map<fname,dir> odb=path;
File newH = "/new/";
For (path:newH)
// Map<fname,dir> ndb=path;
Array newarray[]=ndb.size();
While(odb.hasNext()) {
While (ndb.hasNext()) {
If (odb.fname.next()==ndb.fname.next()) {
newarray[i][0]= odb.path;
newarray[i][1]= ndb.path;
break;
}
i++;
}
这只是伪代码,但希望对您有所帮助。
这假设文件名在从一个目录树迁移到另一个目录树的过程中没有改变。
这是快速而肮脏的,缺少所有完整性检查和错误处理,但它说明了要点:递归下降到目录以收集文件以收集文件名到路径的映射。 comp 方法仅从第一个目录树中获取名称并显示两个目录树中的路径名。
public void find( File root, Map<String, String> map ){
File[] entries = root.listFiles();
for( File file: entries ){
if( file.isDirectory() ){
find( file, map );
} else {
map.put( file.getName(), file.getAbsolutePath() );
}
}
}
public void comp( File root1, File root2 ){
Map<String,String> map1 = new HashMap<>();
find( root1, map1 );
Map<String,String> map2 = new HashMap<>();
find( root2, map2 );
for( String name1: map1.keySet() ){
String path1 = map1.get( name1 );
String path2 = map2.get( name1 );
System.out.println( name1 + ": " + path1 + "->" + path2 );
}
}