我正在尝试编写一个执行以下操作的jave代码,但atm不知道如何实现这一点:
让我们说:我在本地系统上有7个不同或相同路径的文件,我希望在shell命令中使用尽可能少的路径名复制到其他地方
correctfiles是我想要的文件,有些文件我不关心
例如我不想要:
copy C:\tmp\folder1\subfolder12\correctfile3 && copy C:\tmp\folder1\subfolder12\correctfile4
我希望尽可能使用Uberfolder:
copy C:\tmp\folder1\subfolder12\
并要求副本C:\ tmp \ folder1 \ subfolder12中没有somefile 因为我不想转移某些文件
e.g。
C:\ tmp \ folder1:somefile1,somefile2
C:\ tmp \ folder1 \ subfolder11:correctfile1,correctfile2
C:\ tmp \ folder1 \ subfolder12:correctfile3,correctfile4
C:\ tmp \ folder2 \ subfolder21:correctfile5
C:\ tmp \ folder2 \ subfolder22:correctfile6,correctfile7
所以在这个例子中我可以使用
copy C:\tmp\folder2
因为该文件夹中的alle文件是正确的文件
而对于其他人我将不得不
copy C:\tmp\folder1\subfolder11
copy C:\tmp\folder1\subfolder12
因为Uberfolder C:\ tmp \ folder1中有一些我不想传输的文件
我怎么能实现这个目标? 一个java类,它根据路径名对文件进行分组,使用尽可能少的路径名
答案 0 :(得分:0)
这实际上非常简单。从List<File> filesToCopy
创建
Map<String,Set<String>> dir2names = new HashMap<>();
for( File f: filesToCopy ){
String name = f.getName();
// test name for null and do error handling
String dir = f.getParent();
// dir for null and do error handling
Set<String> names = dir2names.get( dir );
if( names == null ){
names = new HashSet<>();
dir2names.put( dir, names );
}
names.add( name );
}
将目录部分映射到文件名。迭代这张地图的键
for( String dirname: dir2names.keySet() ){
File[] entries = new File( dirname ).listFiles();
if( entries.length > dir2names.get( dirname ).size() ){
// add list created from dirname + set of names to files to copy
for( String name: dir2names.get( dirname ){
String pathname = new File( dirname, name ).getAbsolutePath();
// add pathname to files to copy
}
} else {
// add directory identified by dirname to files to copy
}
}
我认为值得递归地做这件事。