Я полагаю, вам нужно иметь getFolder
(?) В вашем классе папок, для которого вы указываете имя папки, и она возвращает подпапку с этим именем.Вы можете использовать свой путь, чтобы пройти по нему в цикле, чтобы "cd" достиг уровня, который вас интересует. Тогда, я думаю, getFile
вернет объект File
.Затем вы можете rename
ваш файл (хотя ваш путь должен быть обновлен, чтобы отражать любые изменения имени папки).
Folder rootFolder = ...;
String[] path = ...;
Folder f = null;
for (int i=0; i<path.length; i++) {
folder = rootFolder.getFolder(path[i]);
}
// f now contains the folder at "path"
// N.B. Haven't handled FolderNotFoundException
File file = f.getFile("Aa2.txt");
file.setName("Aa2.new.txt");
/* Folder#getFolder returning sub-folder for name passed */
public Folder getFolder(String name) {
Folder f = folderCollection.get(name); //no null checks done!
if (f == null) {
... //FolderNotFoundException?
}
return f;
}
В качестве альтернативы, вы можете указать путь (или инкапсулированное представление пути) дляFolder#getFolderInPath
и обработайте все это до Folder
.Эта версия является итеративной, зацикливаясь на массиве путей, обновляя f с этим уровнем в пути к папке на каждой итерации.Он использует getFolder
из вышеперечисленного:
Folder rootFolder = ...;
String[] path = ...;
Folder f = rootFolder.getFolderInPath(path);
File file = f.getFile("Aa2.txt");
/* Folder#getFolder returning sub-folder for name passed
* This is an "iterative" implementation - looping path array
*/
public Folder getFolderInPath(String[] path) {
Folder f = null;
for (int i=0; i<path.length; i++) {
folder = this.getFolder(path[i]);
}
// f now contains the folder at "path"
// N.B. Haven't handled FolderNotFoundException
return f;
}
Это рекурсивная версия вышеприведенного и снова использует getFolder
(выше x 2).Требует некоторого объяснения - #getFolderInPath
теперь просто делегирует рекурсивному методу #getFolderRecursive
, передавая корневые значения рекурсии (начальная папка ["this"] и начальная точка в path - index).
Метод #getFolderRecursive(Folder
рекурсивно вызывает себя до тех пор, пока путь не пройден (пока индекс <путь.длина).Когда он пройден успешно (FolderNotfoundException?), Тогда index = path.length.На каждом уровне мы выполняем рекурсивный вызов с найденной папкой, соответствующей имени на этом уровне в пути (определяется индексом).На нижнем уровне папка, найденная с <code>#getFolder, является последней в пути и должна быть возвращена.Затем рекурсивные методы раскрываются, передавая f вверх по дереву в var folderArtPath
(для ясности).Условие else
устанавливает эту переменную при прохождении пути и переносе вверх по стеку в строке folderAtPath =
в блоке if:
Folder rootFolder = ...;
String[] path = ...;
Folder f = rootFolder.getFolderInPath(path);
File file = f.getFile("Aa2.txt");
/* Folder#getFolder returning sub-folder for name passed
* This is an "recursive" implementation - digging into the Folder structure
*/
public Folder getFolderInPath(String[] path) {
//Begin recursion with "this2 folder"
return getFolderRecursive(this, path, 0);
}
/* Internal recursive method
*/
private Folder getFolderRecursive(Folder baseFolder, String[] path, int index) {
Folder folderAtPath = null; //This is going to carry the Folder at "path"
if (index < path.length) { //Recursive base condition (are we done?)
//Get folder f with name according to path and index
Folder f = baseFolder.getFolder(path[index])); //FolderNotFoundException?
//Recursively call found folder f with path and index referring
//to next path-part to be used (index+1)
folderAtPath = getFolderRecursive(f, path, index+1);
}
else {
folderAtPath = baseFolder;
}
return folderAtPath;
}
Возможно, есть лучший способ сделать это, ноЯ не могу проверить это сейчас.Потратил слишком много времени на это, но пришлось исправить мою мини-готовку.Рекурсия немного увлекательна ... найдите простой пример в сети и просто поиграйте с ним.
Вы также можете захотеть, чтобы папка и файл имели некоторый общий интерфейс.