#java
Помогите, пожалуйста, найти способ в Java обойти все директории на диске без рекурсии? У меня как на зло без рекурсии ничего не выходит.
Ответы
Ответ 1
File rootDir = new File(root); Listresult = new ArrayList<>(); Queue fileTree = new PriorityQueue<>(); Collections.addAll(fileTree, rootDir.listFiles()); while (!fileTree.isEmpty()) { File currentFile = fileTree.remove(); if(currentFile.isDirectory()){ Collections.addAll(fileTree, currentFile.listFiles()); } else { result.add(currentFile.getAbsolutePath()); } } Ответ 2
Делаете список директорий. Изначально он пустой. Берете в качестве текущего элемента начало списка. Заполняете его директориями, лежащими в корне диска. Пока не дошли до конца списка: получаете директории для текущего элемента, добавляете их в список сразу после текущего. Таким образом, когда вы дойдете до конца - у вас будет список всех директорий. Причем отсортированный так, как если бы мы обходили дерево рекурсией: C:\A C:\A\A C:\A\A\A C:\A\A\B c:\A\B C:\B c:\B\A и.т.п.Ответ 3
Попробуйте так (псевдокод) queuetaskList = new queue (); taskList.add(startDir); while (!taskList.empty()) { string dir = taskList.first(); taskList.popFirst(); for each dirEntry in dir { if entry is directory taskList.add(entry); else processFile(entry); } } А вообще, почитайте про обходы дерева, например, BFS/DFS. Ответ 4
Код на скорую руку, но рабочий: import java.io.File; public class Main { public static void main(String[] args) { String rootDir = "d:\\"; File root = new File(rootDir); File[] files = root.listFiles(); int i = 0; while(iОтвет 5
Обход всех каталогов без стека и рекурсии. Добавляем корень в пустой Массив i=0 (начало Массива) Если i-й элемент Массива каталог, то добавляем все его елементы в конец Массива i=i+1 Если i < длины массива, то переход к пункту 3Ответ 6
очень удобно такую задачу делать со стеком. изначально в стек ложится корневая папка. дальше алгоритм такой: 1) выталкиваем последний элемент 2) получаем для папки список подпапок, добавляем все в стек 3) если стек не пустой повторяем пункт 1Ответ 7
Начиная с Java 1.7 import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class FileTree { public static void main(String[] args) { Path pathSource = Paths.get("Введите сюда путь к какому-либо каталогу, содержащему другие каталоги и файлы"); try { Files.walkFileTree(pathSource, new MyFileVisitor()); } catch (IOException e) { e.printStackTrace(); } } } class MyFileVisitor extends SimpleFileVisitor { public FileVisitResult visitFile(Path path, BasicFileAttributes fileAttributes) { System.out.println("file name:" + path.getFileName()); return FileVisitResult.CONTINUE; } public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes fileAttributes) { System.out.println("Directory name:" + path); return FileVisitResult.CONTINUE; } } The Java™ Tutorials - Walking the File TreeОтвет 8
попробую расписать свой код подробно можно так для директорий #! /usr/bin/env python #coding=utf-8 import os #----------------------------------------------------- # Формирует список поддиректорий от текущей директории # на один уровень ниже #----------------------------------------------------- def getCurrDir(rootDir=''): currListDirs=[]; onlyDirsLst=[] currListDirs=os.listdir(rootDir) for i in range(0,len(currListDirs)): currListDirs[i]=(rootDir+'/'+currListDirs[i]) if os.path.isdir(currListDirs[i])==True: if os.path.islink(currListDirs[i])==False: # добавляем только дирректорию (исключая ссылки) onlyDirsLst.append(currListDirs[i]) return onlyDirsLst #--------------------------------------------- # Формирует список поддиректорий, начиная от текущей rootDir # на всю глубину дерева дирректорий #--------------------------------------------- def getLstAllDirs(rootDir=''): oldLst=[]; newLst=[]; currPosLst=0 oldLst.append(rootDir) while True: try: newLst=getCurrDir(oldLst[currPosLst]) for i in newLst: oldLst.append(i) currPosLst+=1 except IndexError: return oldLst или так для директорий и всех в них файлов #-------------------------------------------------------------- # Возвращает кортеж, где первый список - файлы, второй - каталоги # Для одного уровня ниже от rootDir #-------------------------------------------------------------- def getCurrFileDir(rootDir=''): currListDirs=[]; onlyDirsLst=[]; onlyFilesLst=[] currListDirs=os.listdir(rootDir) for i in range(0,len(currListDirs)): currListDirs[i]=(rootDir+'/'+currListDirs[i]) if os.path.isdir(currListDirs[i])==True: if os.path.islink(currListDirs[i])==False: onlyDirsLst.append(currListDirs[i]) else: if os.path.isfile(currListDirs[i])==True: if os.path.islink(currListDirs[i])==False: onlyFilesLst.append(currListDirs[i]) return onlyFilesLst, onlyDirsLst #-------------------------------------------------------------- # Возвращает кортеж, где первый список - файлы, второй - каталоги # Для всех уровней от rootDir; # Если Lst=getLstAllFilesDirs(...), то кортеж Lst==([fa,fb,..],[da,db,..]) # Lst[0]==[fa,fb,..] - список файлов; # Lst[0][1] - второй файл в списке файлов. # Lst[1]==[da,db,..] - список каталогов; # Lst[1][5] - шестой каталог в сп. каталогов. #-------------------------------------------------------------- def getLstAllFilesDirs(rootDir=''): oldLst=([],[]); newLst=([],[]); currPosLst=0 oldLst[1].append(rootDir) while True: try: newLst=getCurrFileDir(oldLst[1][currPosLst]) for i in newLst[1]: oldLst[1].append(i) for i in newLst[0]: oldLst[0].append(i) currPosLst+=1 except IndexError: return oldLst ----------------------- проверяем: cDir='/home' print '= Ждём. Обработка =============================' Lst=getLstAllFilesDirs(cDir) print 'Список файлов:' print '========================' for i in range(len(Lst[0])): print '%4d: %s'%(i,Lst[0][i]) print '=================================================' print 'Список каталогов:' print '========================' for i in range(len(Lst[1])): print '%4d: %s'%(i,Lst[1][i]) print '=================================================\n' print ' Каталоги другой функцией (отсортированные)' print '== Ждём. Обработка ==============================' Lst=getLstAllDirs(cDir) Lst.sort() for i in Lst: print i
Комментариев нет:
Отправить комментарий