Groovy / Java - проблема копирования файлов с круглыми скобками в его пути - PullRequest
1 голос
/ 26 июня 2019

В настоящее время у меня есть скрипт, который копирует файлы из исходного каталога в целевой каталог с помощью включений и исключений регулярных выражений, однако, когда путь содержит круглые скобки, файл не будет копироваться.

Сначала я думал, что проблемабыло с тем, как источник и цель читались с тех пор (это специальный символ, для борьбы с которым я пытался заменить (на экранированный (, но я, возможно, делал эту часть неправильно.

import groovy.io.FileType
import java.nio.file.*

    String Source = 'C:/temp/file(s)'
    String Target = 'C:/newTemp/file(s)'

    String InclusionsRegexes = "garbage.txt"

    String ExclusionsRegexes = ""

    class RegexInfo
    {
        private String AllRegexes = "";

        public RegexInfo(String RegexString, String RegexType, String Source)
        {
            if(RegexString != null)
            {
                def RegexArray = RegexString.split(",");

                for(item in RegexArray)
                {
                    String fullRegexPath = Source + "/" + item;

                    if(AllRegexes != null && !AllRegexes.isAllWhitespace())
                    {
                        //Add regex value for Or
                        AllRegexes += "|";
                    }
                    AllRegexes += fullRegexPath;
                }
            }
        }
        public String getAllRegexes() { return this.AllRegexes; }
    }

    IncludesRegexInfo = new RegexInfo(InclusionsRegexes, "inclusion", Source);
    ExcludesRegexInfo = new RegexInfo(ExclusionsRegexes, "exclusion", Source);

    File SourceDirToCopy = new File(Source);

    SourceDirToCopy.eachFileRecurse()
    {
        SourceFile ->

        String SourceFilePath = SourceFile.toString().replaceAll("\\\\","/");

        if(SourceFile.isDirectory())
        {
            SourceFilePath += "/"
        }

        if(SourceFilePath.matches(IncludesRegexInfo.getAllRegexes()) && !SourceFilePath.matches(ExcludesRegexInfo.getAllRegexes()))
        {
            File TargetFile = new File(SourceFilePath.replace(Source, Target))
            String TargetFilePath = TargetFile.toString().replaceAll("\\\\", "/");

                if(!TargetFile.getParentFile().exists())
                {
                    TargetFile.getParentFile().mkdirs()
                }
                Files.copy(SourceFile.toPath(), TargetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }

Ошибки, которые я получал, были либо непредвиденными символами, либо файл не перемещался без ошибки.

1 Ответ

0 голосов
/ 27 июня 2019

Чтобы решить проблему, связанную с отсутствием копирования скрипта, возникла проблема с if(SourceFilePath.matches(IncludesRegexInfo.getAllRegexes() && !SourceFilePath.matches(ExcludesRegexInfo.getAllRegexes())) при «сопоставлении» двух строк.

Строки, читаемые как одинаковые строки, однако не совпадают с точки зрения регулярных выражений. Чтобы это исправить, вы должны экранировать ( и ) в ExcludesRegexInfo.getAllRegexes(). Это было сделано с .replaceAll("\\(","\\\\(").replaceAll("\\)","\\\\)")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...