2016-01-15 3 views
0

Я работаю над назначением школы, и мы делаем простой файловый менеджер, который должен переместить все файлы с суффиксом "jpg" (например) в другую папку. Проблема в том, что мы должны делать это рекурсивно через все папки.Java - Перемещение файлов в файловой системе

Пример: Вы находитесь в папке «загрузки»:

--downloads 
----me.jpg 
----smth.doc 
----folder1 
------you.jpg 

и теперь вы должны переместить все файлы .jpg в папку «фотографии» и создать «Folder1» там, а также переместить файл «you.jpg "

Это то, что у меня есть, но это, кажется, переместить только файлы из„папки загрузки“

private void move(String suffix, String sourcePath, String destination) throws IOException{ 
    File dir = new File(sourcePath); 
    File destDir = new File(destination); 
    String src; 
    String dst; 

    for (File f : dir.listFiles(new ExtensionFilter(suffix))){ 
     String name = f.getName(); 
     src = f.getAbsolutePath(); 
     dst = destination + "\\" + name; 
     Files.createDirectories(Paths.get(destination)); 
     Files.move(Paths.get(src), Paths.get(dst)); 
     logs.add("MV;" + src + ";" + dst); 
    } 

    for (File f : dir.listFiles(new DirectoryFilter())){ 
     move(suffix, f.getPath(), destination + "\\" + f.getName());  
    } 
} 

журналы просто ArrayList, чтобы сохранить журнал, какие файлы были перемещены

+1

Начните с просмотра [Прогулка по файловому дереву] (https://docs.oracle.com/javase/tutorial/essential/io/walk.html) и [Поиск файлов] (https: // docs. oracle.com/javase/tutorial/essential/io/find.html), или, если вам не разрешено использовать эти методы, вы также можете посмотреть [этот пример] (http://stackoverflow.com/questions/12656569/recursive-method-to-search-through-folder-tree-and-find-specific-file-types/12656594 # 12656594), который использует API 'File' – MadProgrammer

ответ

0

Это может быть намного проще сделать с помощью Java NIO.2 API в сочетании с Java 8.

Java 8 ввел метод Files.walk(path), который возвращает поток всех путей при заданной траектории, рекурсивно:

Верните a Stream, который лениво заселен Path, пройдя дерево файлов, укорененное в заданном начальном файле.

Предлагаемое решение может затем быть следующим:

private void move(String suffix, Path source, Path destination) throws IOException { 
    Files.createDirectories(destination); 
    Files.walk(source) 
     .filter(p -> p.toString().endsWith(suffix)) 
     .forEach(p -> { 
      Path dest = destination.resolve(source.relativize(p)); 
      try { 
       Files.createDirectories(dest.getParent()); 
       Files.move(p, dest); 
      } catch (IOException e) { 
       throw new UncheckedIOException(e); 
      } 
     }); 
} 

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

  • source.relativize(p) возвращает относительный путь от источника к этому пути.

    Например, в UNIX, если этот путь «/ a/b», и данный путь «/ a/b/c/d», тогда результирующий относительный путь будет «c/d».

    Таким образом, это вернет часть пути под источником, чтобы мы могли скопировать ее в целевой путь.

  • destination.resolve(other) возвращает путь, построенный путем добавления этого пути на другой путь:

    В простейшем случае, [...], в этом случае этот метод присоединяется заданный путь к этому пути и возвращается результирующий путь, который заканчивается данным путем.

  • Итак, теперь у нас есть полный путь цели. Сначала нам нужно создать родительские каталоги с помощью Files.createDirectories(dir). dest.getParent() возвращает родительский путь, то есть он удаляет имя файла из пути. Последним шагом является перемещение пути источника к целевому пути с помощью Files.move(source, target).

Если вы не можете перейти на Java 8 еще и поддерживать с Java 7, вы все еще можете использовать Files.walkFileTree вместо Files.walk (остальная часть кода будет нуждаться в корректировке, но идея та же).

+0

спасибо, это определенно поможет :) – healadin

0

Пробуйте использовать FileUtils от Apache Commons IO. Это самый простой способ.

+0

Давайте предположим на мгновение, что, поскольку это школа они не поощряются от использования сторонних библиотек и будут поощрять использование базовых Java-библиотек – MadProgrammer

+0

да, мы не сможем использовать его – healadin

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