Java, поиск по папкам, чтобы найти имя - PullRequest
2 голосов
/ 06 апреля 2010

Я использую Java для поиска файла или папки, соответствующей конкретному случаю. Например, я хочу просмотреть все файлы и папки и повторять их столько раз, сколько потребуется, пока не найду результат.

Улов

Я ищу файлы и папки через двоичный образ файловой системы. Это означает, что я сомневаюсь, что существуют какие-либо ранее существовавшие классы, такие как java.file.*, чтобы сделать это для меня. Если это поможет, я могу вам сказать, что могу достаточно легко определить разницу между файлами и папками. (папка помечена как 0x20)

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

Весь ввод приветствуется

Редактировать

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

Я думаю, что термин "каталог" может вводить в заблуждение. Учитывая начальное значение 0, я хочу изучить серию байтов. Если в правильном месте я сталкиваюсь с 0x20 (маркер каталога), мне нужно перейти в новое место в двоичном изображении и начать поиск снова. Если я снова столкнусь с 0x20, мне нужно прыгнуть и начать снова; по окончании я возвращаюсь к той точке, в которой находился, и продолжаю искать другой 0x20 Мне нужно делать это до тех пор, пока у меня не останется 0x20 в определенных местах.

Я могу сделать это, используя петли n , но это займет у меня только n каталогов. Мне интересно, есть ли у кого-нибудь идеи, как это сделать, пока не останется больше маркеров каталога.

Не совсем уверен, что это проясняет ситуацию, но я надеюсь, что это так.


EDIT Это код, который я использую, и я получаю ошибку переполнения стека. какие-нибудь идеи о том, как я могу улучшить это?

  public boolean isDirectory(int dirAttr)
{
    if (dirAttr == dir.ATTR_DIRECTORY)
        return true;
    else return false;
}
public void searchDirectory(int clusterNum, String name)
{
    for (int i = 0; i<32;i++)
    {
        if(dir.DIR_NameS(clusterNum, i).contains(name))
        {
            System.out.println("Found a Match");
            System.out.println("File name = " + dir.DIR_NameS(clusterNum, i));
            System.out.println("File size in bytes = "+dir.DIR_FileSize(clusterNum, i));
            System.out.println("File starting cluster = "+dir.DIR_FstClusLO(clusterNum, i));
            System.out.println();
        }
        if(this.isDirectory(dir.DIR_Attr(clusterNum, i)))
        {
            searchDirectory(dir.DIR_FstClusLO(clusterNum, i), name);
        }
    }
}

Ответы [ 4 ]

1 голос
/ 07 апреля 2010

Я могу сделать это, используя n циклов, но это только уведет меня в каталоги. Мне интересно, есть ли у кого-нибудь идеи о том, как это сделать, пока нет другие маркеры каталога.

Подобные вещи выполняются с помощью рекурсии или стека (на более глубоком уровне они эквивалентны).

Для рекурсивного решения у вас будет метод, который просматривает папку и вызывает себя всякий раз, когда обнаруживает подпапку. Список может быть параметром, переданным методу, к которому добавляются результаты.

Для стекового решения вы создаете стек (или список) каталогов, которые необходимо найти. Он начинается с корневого каталога как его единственного содержимого. Затем, пока стек не пуст, вы удаляете из него один каталог, просматриваете его и добавляете все подкаталоги в стек и все соответствующие файлы в список результатов. Повторяйте, пока стек не станет пустым.

1 голос
/ 06 апреля 2010

Как вы взаимодействуете с этим изображением?Это просто массив байтов?

В этом случае вы не можете сделать это в Java, не внедрив что-либо, способное проанализировать структуру FAT16 (или не найдя API для взаимодействия с файловыми системами, сохраненными в виде файлов), поэтому вам следует перейти здесь и изучите структуру таблицы размещения файлов ..

0 голосов
/ 06 апреля 2010

Единственный способ, которым я могу придумать, - это сделать стандартный цикл и выполнить итерацию несколько раз, но это ограничивает меня, если файл или папка имеют несколько папок глубиной [...] Я могу сделать это, используя n циклов, но это будет только возьмите меня на глубину. Мне интересно, есть ли у кого-нибудь идеи о том, как это сделать, пока не останется больше маркеров каталога.

Мне кажется, что у вас проблемы с рекурсивной частью, а не с IO. Вот схема алгоритма для вас:

public class RecurseDirectories {
    static String image =
      ";@root=<f1,f2,@d1,@d2,@foo>;@d1=<x,@d1d1>;@d2=<y>;@d1d1=<a,b>;@bar=<>;";

    String getContent(String dir, String image) {
        return image.replaceAll(
            "^.*;dir=<(.*?)>.*$|.*".replace("dir", dir),
            "$1"
        );
    }
    String[] iterable(String content) {
        return content.split(",");
    }
    boolean isDirectory(String file) {
        return file.startsWith("@");
    }

    void recurse(String image, String path, String dir) {
        String dirContent = getContent(dir, image);
        System.out.format("%s%s=<%s>%n", path, dir, dirContent);
        for (String file : iterable(dirContent)) {
            if (isDirectory(file)) {
                recurse(image, path + dir, file);
            }
            // do any checking of file here
        }
    }
    public static void main(String[] args) {
        new RecurseDirectories().recurse(image, "", "@root");
    }
}

Это распечатывает:

@root=<f1,f2,@d1,@d2,@foo>
@root@d1=<x,@d1d1>
@root@d1@d1d1=<a,b>
@root@d2=<y>
@root@foo=<>

getContent, isDirectory, и формат строки изображения специфичен для этого примера, но recurse в основном то, что вы хотите изучить. Это форма поиска в глубину .

Убедитесь, что в структуре дерева каталогов нет самодостаточности (возможно, из-за символических ссылок и т. Д.), Поскольку это может привести к бесконечной рекурсии (пока не произойдет StackOverflowError).

Кроме того, если вы хотите избежать просмотра изображения несколько раз в течение поиска, вы можете пройти его один раз, чтобы построить дерево, а затем recurse через это дерево (то есть, в основном, getContent - это то, что вы хотите оптимизировать).

0 голосов
/ 06 апреля 2010

FileUtils.listFiles(rootDir, null, true) (из commons-io ) выдаст вам все файлы из указанного корневого каталога.

Затем вы можете выполнить итерацию возвращенной коллекции, чтобы увидеть, соответствует ли File в ней вашим критериям.

Примечания. Это не зависит от платформы. Аргумент true означает, что все файлы выбираются рекурсивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...