Java 在路径名之后对文件进行分组
我正在尝试编写一个jave代码,它可以执行以下操作,但atm不知道如何实现这一点: 假设:我在本地系统上有7个不同或相同路径的文件,我希望在shell命令中使用尽可能少的路径名将它们复制到其他地方 正确的文件是我想要的文件,一些我不关心的文件 例如,我不想要:Java 在路径名之后对文件进行分组,java,shell,Java,Shell,我正在尝试编写一个jave代码,它可以执行以下操作,但atm不知道如何实现这一点: 假设:我在本地系统上有7个不同或相同路径的文件,我希望在shell命令中使用尽可能少的路径名将它们复制到其他地方 正确的文件是我想要的文件,一些我不关心的文件 例如,我不想要: copy C:\tmp\folder1\subfolder12\correctfile3 && copy C:\tmp\folder1\subfolder12\correctfile4 相反,我希望尽可能使用Uber文件
copy C:\tmp\folder1\subfolder12\correctfile3 && copy C:\tmp\folder1\subfolder12\correctfile4
相反,我希望尽可能使用Uber文件夹:
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
因为该文件夹中的所有文件都是正确的文件
而对于其他人,我不得不这样做
copy C:\tmp\folder1\subfolder11
copy C:\tmp\folder1\subfolder12
因为文件夹C:\tmp\folder1中有一些文件我不想传输
我怎样才能做到这一点?
根据路径名对文件进行排序的java类,使用尽可能少的路径名这实际上非常简单。从列表文件复制创建一个
我认为递归地这样做是不值得的。您确实意识到,分解和复制目录而不是包含单个文件会导致语义上的细微变化,可能不是很细微的变化,从而导致数据的实际复制内容和方式?是的,但对于这项任务来说,这并不重要,只是想从理论上找出这是如何实现的这似乎是一个毫无意义的复杂优化。目的是…我正在创建一个带有传输活动的Bpel流程,该流程只理解带有路径名的shell命令,我必须遍历作为参数给出的路径名列表,并将当前路径中的文件逐个传输到带有for循环的远程计算机。现在我想通过在可能的情况下将所有路径名分组为一个路径名来摆脱forloop,否则将路径名分组为尽可能少的路径名以减少迭代次数。我不确定我是否理解这一点,很抱歉,这是一个初学者,你不理解什么?Stackoverflow不是一个编程服务,我做了更多的工作,只是说“显示您的代码”,这是对像您这样的问题的惯常回答。非常感谢您的回答。也许我没有把它说对,我没有要求一个更好或更容易理解的解决方案或其他什么。我只是想了解你的解决方案。我还没有一个代码,但是有一个概念性的想法。提供这个概念性的想法是我回答的全部要点:-我从一个文件对象列表开始,它可以很容易地从一个路径名列表创建。
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
}
}