Как быстро найти добавленным / удаленные файлы?

Несколько замечаний:

  1. .menu:nth-child(1) будет искать элемент class="menu", который является самым первым дочерним элементом его родителя. Без вашего контекста я не могу сказать, существует ли это, но это, вероятно, не то, что вы хотите в этом случае.

  2. nth-child() начинается с 1, а не с 0.

  3. div:nth-child(1) будут применяться только к <div> элементам, которые являются первыми дочерними элементами их родителей. Если вы посмотрите на свой HTML, ни один из ваших элементов <div> не будет первым потомком их родителя. Вместо этого вы можете начать с div:nth-child(2).

  4. Вы можете вытащить некоторые из общих вещей и поместить их в nth-child(odd) и nth-child(even), чтобы избежать повторения.

Опираясь на это, вы можете посмотреть что-то вроде кода ниже. (Я уменьшил объем вашего CSS, который я не коснулся, просто чтобы было немного яснее, что я изменил)

11
задан 9 revs 23 May 2017 в 09:57
поделиться

10 ответов

Я сделал это в своем инструменте MetaMake. Вот рецепт:

  1. Если индекс пуст, добавьте корневой каталог к индексу с меткой времени == dir.lastModified ()-1.
  2. Найдите все каталоги в индексе
  3. Сравните метку времени каталога в индексе с тем от файловой системы. Это - быстрая операция, так как у Вас есть полный путь (никакое сканирование всех файлов/директоров во включенном дереве).
  4. Если метка времени изменилась, у Вас есть изменение в этом каталоге. Повторно просканируйте его и обновите индекс.
  5. Если Вы встречаетесь с недостающими каталогами на этом шаге, удаляете поддерево из индекса
  6. Если Вы встретитесь с существующим каталогом, проигнорируете его (то будет проверен на шаге 2),
  7. При обнаружении с новым каталогом добавьте его с меткой времени == dir.lastModified ()-1. Удостоверьтесь, что это рассматривают на шаге 2.

Это позволит Вам замечать новые и удаленные файлы эффективным способом. Так как Вы сканируете только для известных путей на шаге № 2, это будет очень эффективно. Файловые системы плохи при перечислении всех записей в каталоге, но они быстры, когда Вы знаете точное имя.

Недостаток: Вы не заметите измененные файлы. Таким образом, при редактировании файла это не отразится в изменении каталога. При необходимости в этой информации также, необходимо будет повторить алгоритм выше для узлов файла в индексе. На этот раз можно проигнорировать новые/удаленные файлы, потому что они были уже обновлены во время работавшего каталоги.

Zach [РЕДАКТИРОВАНИЯ] упомянул, что метки времени недостаточно. Мой ответ: просто нет никакого другого способа сделать это. Понятие "размера" абсолютно неопределяемо для каталогов и изменений от реализации до реализации. Нет никакого API, где можно зарегистрироваться, "Я хочу быть уведомленным относительно любого изменения, внесенного во что-то в файловой системе". Существуют API, которые работают, в то время как Ваше приложение живо, но если оно останавливает или пропускает событие, затем Вы вне синхронизации.

Если файловая система является удаленной, вещи ухудшаются, потому что все виды сетевых проблем могут заставить Вас выходить из синхронизации. Таким образом, в то время как мое решение не могло бы быть на 100% идеальным и трудная вода, это будет работать на всех кроме наиболее созданного исключительного случая. И это - единственное решение, которое даже добирается настолько далеко.

Теперь существует единственное доброе приложение, которое хотело бы сохранить метку времени каталога после создания модификации: вирус или червь. Это ясно повредит мой алгоритм, но затем, он не предназначен для защиты от заражения вирусом. Если Вы хотите защитить от этого, Вы должны совершенно другой подход.

Единственный другой способ достигнуть, что хочет Zach, состоит в том, чтобы создать новую файловую систему, которая регистрирует эту информацию постоянно где-нибудь, продайте его Microsoft и ожидайте несколько лет (вероятно, 10 или больше), пока все не используют его.

4
ответ дан 3 December 2019 в 05:37
поделиться

К сожалению, нет никакого стандартного способа слушать события файловой системы в Java. Это может прибывать в java7.

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

6
ответ дан 3 December 2019 в 05:37
поделиться

Можно ли выпрыгнуть из Java.

Вы могли просто использовать

dir /b /s /on M:\tests\  

/ на видах по имени

если Вы передаете это по каналу к out.txt

Затем сделайте разность к прошлому разу, когда Вы выполнили этот файл или в Java или в пакетном файле. Что-то вроде этого в DOS. Необходимо было бы получить различный инструмент, или разность в cygwin или превосходный http://gnuwin32.sourceforge.net/packages/diffutils.htm

dir /b /s /on m:\tests >new.txt
diff new.txt archive.txt >diffoutput.txt
del archive.txt
ren new.txt archive.txt

Очевидно, Вы могли использовать класс разности Java также, но я думаю, что вещь принять состоит в том, что команда оболочки почти всегда собирается разбить Java при операции списка файлов.

7
ответ дан 3 December 2019 в 05:37
поделиться

Одним путем Вы могли убыстриться, вещи должен просто выполнить итерации по каталогам и проверить в прошлый измененный раз, чтобы видеть, изменилось ли содержание каталога, так как Ваш последний индекс, и если они имеют просто, делает нормальное сканирование на каталоге затем и видит, можно ли найти где вещи измененный. Я не знаю, насколько портативный это будет tho, но он изменяющий иерархию распространяет в системе Linux (мог бы быть иждивенец файловой системы), таким образом, можно запустить в корне и проложить себе путь вниз, остановившись при ударе каталога, который не изменился

3
ответ дан 3 December 2019 в 05:37
поделиться

Учитывая, что мы не хотим следить за развитием событий файловой системы, могли мы затем просто отслеживать (name,size,time,checksum) из каждого файла? Вычисление контрольной суммы файла (или криптографический хеш, если Вы предпочитаете) будет узким местом. Вы могли просто вычислить его однажды в начальной букве, выполненной, и повторно вычислить его только при необходимости впоследствии (например, когда файлы соответствуют на других трех атрибутах). Конечно, мы не должны беспокоиться этим, если мы только хотим отследить имена файлов и не содержание файла.

Вы упоминаете, что Ваша реализация Java (подобный этому) является очень медленной по сравнению с"dir /s". Я думаю, что существует две причины этого:

  1. File.listFiles() является по сути медленным. Посмотрите, что этим более ранним вопросом "Является там обходное решение для низкой производительности Java при обходе огромных каталогов?", и этот Java RFE "File.list(FilenameFilter) не является эффективным для огромных каталогов" для получения дополнительной информации. Этот недостаток, по-видимому, обращен NIO.2, прибыв скоро.

  2. Вы пересекаете свои каталоги с помощью рекурсии? Если так, попробуйте нерекурсивный подход, как продвижение/сование каталогов быть посещенными вкл\выкл стек. Мой ограниченный личный опыт показывает, что улучшение может быть довольно существенным.

1
ответ дан 3 December 2019 в 05:37
поделиться

Подход даты файла не мог бы быть лучшим. Например, если Вы восстанавливаете файл от резервного копирования. Возможно, во время индексации Вас мог сохранить хеш MD5 содержания файла. Однако Вы, возможно, должны были бы сделать некоторое сравнительное тестирование производительности, чтобы видеть, приемлема ли производительность

0
ответ дан 3 December 2019 в 05:37
поделиться

Я услышал, что эту задачу очень трудно сделать эффективно. Я уверен, что MS реализовал бы подобный инструмент к Windows, если это было легко, особенно в наше время, так как HD:s растут и растут.

0
ответ дан 3 December 2019 в 05:37
поделиться

Как насчет чего-то вроде этого:

private static String execute( String command ) throws IOException  { 
    Process p = Runtime.getRuntime().exec( "cmd /c " + command );
    InputStream i = p.getInputStream();
    StringBuilder sb = new StringBuilder();
    for(  int c = 0 ; ( c =  i.read() ) > -1  ; ) {
        sb.append( ( char ) c );
    }
    i.close();
    return sb.toString();
}

(Существует большой простор для совершенствования там, так как та версия читает один символ за один раз: можно выбрать лучшую версию отсюда до чтения поток быстрее),

И Вы используете в качестве аргумента:

"dir /b /s M:\tests\"

Если это будет используемым в запущенном приложении (скорее и быть автономным приложением), можно обесценить "теплое" время JVM, это - приблизительно 1 - 2 secs в зависимости от аппаратных средств.

Вы могли дать ему попытку видеть то, что является влиянием.

0
ответ дан 3 December 2019 в 05:37
поделиться

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

0
ответ дан 3 December 2019 в 05:37
поделиться

Я не проверил, что реализация или производительность, но свободное-городское-население-io имеют listFiles () метод. Это могло бы стоить попытки.

0
ответ дан 3 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: