Я создаю приложение, которое автоматически сортирует и упорядочивает файлы в базе данных. Я написал свой код для чтения файлов в импортированной папке по одному и обработки их в БД. Однако у меня возникают проблемы с зацикливанием этого процесса, поэтому я могу обрабатывать файлы, вложенные в любое количество папок в исходной папке, которую пользователь хочет ввести.
Мне просто нужно указать моей программе вернуться к определенной части моего кода и начать работу оттуда снова.
Другой возможный способ решить эту проблему — создать способ перечисления всех отдельных файлов в папке (включая все файлы в подпапках), и я мог бы легко вписать это в свою программу.
Я пытался использовать помеченные ключевые слова continue, return и break на основе ответа, который я получил в Интернете, но я никогда не ожидал, что им удастся вернуть мой код обратно в определенное место.
JFileChooser chooser = new JFileChooser();
chooser.setSelectedFiles(null);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.showOpenDialog(null);
//Getting file paths from within folder
File f = chooser.getSelectedFile();
String file = f.getAbsolutePath();
if (f.isDirectory()) {
//Need to loop back to here
File folder = new File(file);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isDirectory()) {
//Code here is run if there is a folder within a folder. I tested it too
//I want the code here to loop back above where it says "Need to loop back to here"
}
if (listOfFiles[i].isFile()) { //Once I list the files from within the folder, their information gets assigned variable here, and the rest of my program sorts it and saves it to DB accordingly.
//Everything below here is not important, but it might be helpful to see what happens each file with the folders.
System.out.println(listOfFiles[i]);
String filename = (listOfFiles[i].getName()); //For Files
Long filemodified = (listOfFiles[i].lastModified());
String filepath = (listOfFiles[i].getAbsolutePath());
Long filesizeraw = (listOfFiles[i].length());
long filehashcode = (listOfFiles[i].hashCode());
String fileparent = (listOfFiles[i].getParent());
В настоящее время сообщения об ошибке нет. Он будет обрабатывать любые отдельные файлы непосредственно в импортированном файле (не вложенном ни в одну папку внутри папки), но не будет обращаться ни к одному из файлов, находящихся в папках внутри папок.
Одним из решений является рефакторинг вашего кода и использование рекурсии.
@CPerkins Я знаю, как использовать циклы while, и я не думаю, что это подходит для того, что я пытаюсь сделать. Возможно, вы неправильно прочитали мой вопрос, не могли бы вы взглянуть на него еще раз?
Предложение рекурсии @JohnPeabody GirishB - хорошее решение. Рекурсия может принимать форму одной функции или может быть реализована с помощью объектов и методов. Но формальное изучение рекурсии показывает, что многие (большинство?) рекурсивных алгоритмов можно развернуть в базовые циклы. Если циклы while (и for, if и т. д.), функции и объекты не могли решить проблему, то поиск какого-то нового скрытого аспекта языка может обернуться разочарованием. Ваш вызов законен, просто существует так много способов сделать это, что он, вероятно, слишком широк для вопроса SO.
Если вы не хотите делать рекурсию (что, вероятно, является правильным), я думаю, что @CPerkins пытается понять это. Добавьте свой основной каталог в список неисследованных каталогов. Затем пока(список неисследованных каталогов не пуст){убрать первый из списка. Просмотрите все его файлы, делая все, что вам нужно, с фактическими файлами и добавляя все найденные каталоги в ваш список неисследованных каталогов}
Изучив новый раздел «Как спрашивать» и другие справочные страницы, я решил, что, возможно, я слишком ограничителен, и поэтому начал набрасывать ответ... но, как я и опасался, я обнаружил, что начинаю объяснять переменную область видимости, инкапсуляцию данных, основы определения функций и когда отдельные функции наиболее полезны... все для того, чтобы правильно объяснить рекурсию. Он начинает становиться полноценным учебником по программированию. Это не грубость, а только указание на то, что вопрос заголовка действительно настолько фундаментален, что нет короткого ответа, кроме «попробовать рекурсию» или «попробовать цикл while».
@CPerkins спасибо вам обоим за ответы. Рекурсия, безусловно, правильный путь. У меня есть приличный опыт с ним, и я использую его сейчас. Просто боль переписать кучу кода.




Another possible way to solve this issue would be to create a way to list out all of the individual files within folder (including all the files within subfolders), and I could easily fit that into my program too
Хотя это не делает вставки SQLite, следующий класс извлекает список (объектов File) файлов (таким образом, имя файла и путь доступны через объект File).
public class FTS {
private ArrayList<File> mFileList; //Resultant list of Files extracted
private String mBaseDirectory; // The Directory to search
private long mSubDirectoryCount; // The count of the subdirectories
//Constructor
public FTS(String directory) {
this.mBaseDirectory = directory;
this.mSubDirectoryCount = 0;
buildFileListing(this.mBaseDirectory);
}
//
private void buildFileListing(String directory) {
// Initialise the ArrayList for the result
if (mFileList == null) {
mFileList = new ArrayList(){};
}
//Get the File (directory to process)
File dir = new File(directory);
// Get the List of the Directories contents
String[] filelist = dir.list();
// If empty (null) then return
if (filelist == null) {
return;
}
// Loop through the directory list
for (String s: filelist) {
//get the current list item as a file
File f = new File(dir.getAbsolutePath() + File.separator + s);
// is it a file or directory?
if (f.isFile() && !f.isDirectory()) {
this.mFileList.add(f); // If a file then add the file to the extracted list
} else {
// If a directory then increment the count of the subdirectories processed
mSubDirectoryCount++;
// and then recursively call this method to process the directory
buildFileListing(f.getAbsolutePath());
}
}
}
// return the list of extracted files
public ArrayList<File> getFileList() {
return this.mFileList;
}
// return the number of sub-directories processed
public long getSubDirectoryCount() {
return this.mSubDirectoryCount;
}
}
Пример использования вышеизложенного: -
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
FTS fileTreeSearch;
String BaseDirectory = "E:" + File.separator;
List<File> files = (fileTreeSearch = new FTS(BaseDirectory)).getFileList();
System.out.println("Extracted " + String.valueOf(files.size()) + " files, from " + String.valueOf(fileTreeSearch.getSubDirectoryCount()) + " sub-directories of " + BaseDirectory);
/* this commented out code would process all the extracted files
for (File f: files) {
System.out.println("File is " + f.getName() + "\t\t path " + f.getAbsolutePath());
}
*/
}
}
Пример вывода при выполнении вышеизложенного: -
Extracted 186893 files, from 54006 sub-directories of E:\
Спасибо! Это сработало отлично. Ваш код ясен, легко читается и эффективен.
Вы уже используете циклы for. Как насчет в то время как циклы и всех других структур управления, доступных в java? Переполнение стека — не лучшее место для ответов на полные руководства по основным методам программирования.