2014-11-21 2 views
0

я пытаюсь написать код Jave, который делает следующее, но атм не имеет ни малейшего понятия, как реализовать это:группа файлы после имен путей

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

correctfiles являются файлами я хочу, somefiles я не забочусь о

, например, я не хочу:

copy C:\tmp\folder1\subfolder12\correctfile3 && copy C:\tmp\folder1\subfolder12\correctfile4 

вместо я хочу Uberfolder всякий раз, когда возможно:

copy C:\tmp\folder1\subfolder12\ 

и требует, чтобы не некий-файл в копии C: \ TMP \ folder1 \ subfolder12 , потому что я не хочу, чтобы передать некий-файл

например

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

поэтому в данном примере я Коула d использовать

copy C:\tmp\folder2 

потому Alle файлы в этой папке находятся correctfiles

и для других я бы

copy C:\tmp\folder1\subfolder11 
copy C:\tmp\folder1\subfolder12 

, потому что есть somefiles в Uberfolder C: \ TMP \ Folder1, что I не хотят переводить

как я могу это достичь? класс java, который группирует файлы в соответствии с именами путей, используя как можно меньше возможных путей

+0

Вы понимаете, что факторизация и копирование каталогов, а не отдельных файлов приводит к тонким (и, возможно, не столь тонким) изменениям в семантике и, как следствие, тому, что и как фактически копируются данные? – laune

+0

да, но для этой задачи это не так важно, просто пытаюсь выяснить, как это может быть достигнуто теоретически. – sakal

+0

Это кажется бессмысленной и сложной оптимизацией. [Какова цель кода?] (Http: //mywiki.wooledge.org/XyProblem) – l0b0

ответ

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 
    } 
} 

Я не думаю, что это стоит делать рекурсивно.

+0

не уверен, что я это понимаю, извините, новичок здесь – sakal

+0

Что вы не понимаете? Stackoverflow не является сервисом программирования, и я сделал больше, просто говоря «покажите нам свой код», который является обычным ответом на такие вопросы, как ваш. – laune

+0

Большое спасибо за ваш ответ. возможно, я не исправился, я не требовал лучшего или более понятного решения или чего-то еще. просто заявил, что я пытаюсь понять ваше решение. У меня еще нет кода, но концептуальная идея. – sakal

Смежные вопросы