Java 递归目录扫描后放入映射

Java 递归目录扫描后放入映射,java,for-loop,dictionary,recursion,Java,For Loop,Dictionary,Recursion,我正在尝试编写一个工具,它可以将更新的文件复制到文件夹结构中。此文件夹结构分为“实例”,因此根文件夹显示以下内容: Test1[目录] Test2[目录] Test3[目录] 在这些目录中,还有更多的目录,当然还有文件。由于我想更新这些文件夹中的一些文件(更新的文件位于我的工具可以访问的另一个文件夹中),所以我搜索整个结构。更新后的文件名与旧文件名相同,分别位于Test1、Test2和Test3的子文件夹中 我查找了一个递归方法来遍历这些文件夹并进行搜索。当我的工具在同一个实例中找到第二个文

我正在尝试编写一个工具,它可以将更新的文件复制到文件夹结构中。此文件夹结构分为“实例”,因此根文件夹显示以下内容:

  • Test1[目录]
  • Test2[目录]
  • Test3[目录]
在这些目录中,还有更多的目录,当然还有文件。由于我想更新这些文件夹中的一些文件(更新的文件位于我的工具可以访问的另一个文件夹中),所以我搜索整个结构。更新后的文件名与旧文件名相同,分别位于Test1、Test2和Test3的子文件夹中

我查找了一个递归方法来遍历这些文件夹并进行搜索。当我的工具在同一个实例中找到第二个文件时,它必须抛出一个错误并结束for循环

此外,在查找一个更新文件(patchfile)后,临时列表(我在其中检查是否存在重复文件)将被清空。这一切都很好,就像代码中一样

但是,当我期待着用patchfolder中的patchfile替换实例中的旧文件时,我感到困惑,不知道如何工作

我计划映射旧的(扫描的)文件(图中的值)和实际的补丁文件(键)的位置,然后只处理图中的元素但是我应该把put函数完美地放在哪里呢?The在我的主方法中嵌套的循环(迭代实例并迭代许多补丁文件)除了扫描实例的递归方法之外,还让我搞不清楚“map.put(…)”应该放在哪里

这是到目前为止我的代码。此外,如果您有优化方面的建议,我将非常高兴听到

进一步提到:我的工具通过xml和JAXB获取实例的parentfolder,并将实例列表放入我迭代的ArrayList(instances->getInstances())中

public class Main {

public static void main(String[] args) throws SAXException, JAXBException {
    XMLHandler xmlhandler = new XMLHandler();
    InstanceManager manager = new InstanceManager();
    PatchFileManager patchManager = new PatchFileManager(xmlhandler.getUpdateFolder());

    patchManager.scanDirectoryForPatches();
    ArrayList<PatchFile> patchFilesname = patchManager.getPatchFiles();
    manager.setPathnameToScan(xmlhandler.getTargetFolder());
    manager.scanDirectoryForInstances(manager.getPathnameToScan());
    PatchManager ptchmngr = new PatchManager();

    outerloop:
    for (PatchFile f : patchFilesname) {
        for (Instance e : manager.getInstances()) {
            ptchmngr.scanInstallationForPatchFile(e.getPathname(), f);
            if(ptchmngr.getPatchSearchTempChecker().size()>1){
                System.out.println("loop stopped");
                break outerloop;
            }
        }

    }
....
}
}
公共类主{
公共静态void main(字符串[]args)抛出SAXException、JAXBEException{
XMLHandler=新的XMLHandler();
InstanceManager=new InstanceManager();
PatchFileManager patchManager=新的PatchFileManager(xmlhandler.getUpdateFolder());
patchManager.scanDirectoryForPatches();
ArrayList patchFilesname=patchManager.getPatchFiles();
setPathnameToScan(xmlhandler.getTargetFolder());
scandDirectoryForInstances(manager.getPathnameToScan());
PatchManager ptchmngr=新的PatchManager();
外部环路:
for(PatchFile f:patchFilesname){
例如(实例e:manager.getInstances()){
ptchmngr.scanstallationforpatchfile(e.getPathname(),f);
如果(ptchmngr.getPatchSearchTempChecker().size()>1){
System.out.println(“循环停止”);
断开外环;
}
}
}
....
}
}
以及实际的类,在该类中扫描文件夹(不包括getter和setter)

公共类补丁管理器{
专用实例管理器安装管理器;
private ArrayList backUpList=新的ArrayList();
私人AspX管理员theAspxHandler;
private ArrayList patchFileList=new ArrayList();
私人日志管理器日志管理器;
私有ArrayList patchSearchTempChecker=新ArrayList();
private HashMap map=new HashMap();
公共无效复制修补程序(修补文件修补文件){
}
公共无效搜索文件(修补文件修补文件){
}
public void createBackUp(PatchFile PatchFile){
}
public void scanInstallationForPatchFile(字符串搜索开始,PatchFile PatchFile){
File filetoSearch=新文件(searchstart);
试一试{
if(filetoSearch.isDirectory()){
System.out.println(“搜索目录…”+filetoSearch.getAbsolutePath());
if(filetoSearch.canRead()){
对于(文件temp:filetoSearch.listFiles()){
如果(patchSearchTempChecker.size()>1){
抛出新的DoubleDefinitionException();
}
if(temp.isDirectory()&&!(temp.getName().equals(“图像”)){
扫描安装补丁文件(temp.getAbsolutePath(),补丁文件);
}否则{
if(patchfile.getFilename().toLowerCase().equals(temp.getName().toLowerCase())){
patchSearchTempChecker.add(temp.getAbsolutePath().toString());
System.out.println(patchSearchTempChecker.size());
}
}
}
}
}否则{
System.out.println(“拒绝许可”);
}
}抓住(
双重定义(例外)
{
System.out.println(“文件在实例中存在多次,请手动继续”);
}
}
//接球手和接球手
//...
//
}

那么问题出在哪里?也许我错过了,但你能强调一下吗?你想从一个目录中获取一批补丁并应用到另一个目录吗?听起来像是git的工作。尽管如此,我还是想通过Java编程。对我来说,歪曲版本控制软件似乎不是很聪明。
public class PatchManager {

private InstanceManager theInstanceManager;
private ArrayList<BackUp> backUpList = new ArrayList<BackUp>();
private ASPXManager theAspxHandler;
private ArrayList<PatchFile> patchFileList = new ArrayList<PatchFile>();
private LogManager theLogManager;
private ArrayList<String> patchSearchTempChecker = new ArrayList<String>();
private HashMap map = new HashMap();

public void copyPatch(PatchFile patchfile) {

}

public void searchFiles(PatchFile patchFile) {

}

public void createBackUp(PatchFile patchfile) {

}

public void scanInstallationForPatchFile(String searchstart, PatchFile patchfile) {
    File filetoSearch = new File(searchstart);
    try {
        if (filetoSearch.isDirectory()) {
            System.out.println("Searching directory..." + filetoSearch.getAbsolutePath());
            if (filetoSearch.canRead()) {
                for (File temp : filetoSearch.listFiles()) {
                    if (patchSearchTempChecker.size() > 1) {
                        throw new DoubleDefinitionException();
                    }
                    if (temp.isDirectory() && !(temp.getName().equals("Images"))) {
                        scanInstallationForPatchFile(temp.getAbsolutePath(), patchfile);
                    } else {
                        if (patchfile.getFilename().toLowerCase().equals(temp.getName().toLowerCase())) {
                            patchSearchTempChecker.add(temp.getAbsolutePath().toString());
                            System.out.println(patchSearchTempChecker.size());
                        }
                    }
                }
            }
        } else {
            System.out.println("Permission denied");
        }
    } catch (

    DoubleDefinitionException ex)

    {
        System.out.println("File does exist multiple times within instance, proceed manually");
    }
}
//Getters and Setters
//...
//
}