2014-11-05 2 views
0

В настоящее время плагин будет генерировать серию файлов в IProject, мне нужно проверить, был ли сгенерированный файл ранее изменен пользователем. Если созданный артефакт был изменен пользователем, мне придется обрабатывать регенерацию по-разному.Как проверить сгенерированный файл был изменен в разработке плагина Eclipse?

Что я могу придумать, проверив дату создания == Измененная дата. Тот факт, что я удалю старый файл и создам его снова, когда пользователь не коснулся файла раньше, чтобы убедиться, что дата создания всегда равна Модифицированной дате. Однако я не видел, как получить эти 2 свойства от IFile. Кто-нибудь может помочь мне в этом?

Я довольно новичок в разработке плагинов Eclipse, может ли кто-нибудь предложить другой способ обойти это?

*** Создаваемые файлы не могут быть заблокированы, как те исходные коды

ответ

1

Модификации штамп из IFile или более обычно является IResource может быть получен с getModificationStamp(). Возвращаемое значение не является строго отметкой времени, но должно служить вашим потребностям, см. JavaDoc.

Если вы хотите отследить, было ли изменено содержимое файла, я бы скорее вычислил хэш содержимого, например, с помощью MessageDigest. Затем вы можете сравнить два хэша, чтобы решить, был ли файл изменен.

Этот последний подход будет рассматривать файл как неизменный, если он был изменен - ​​сохранен - ​​изменения возвращены - сохранены снова. С другой стороны, штамп изменения объявит файл измененным, даже если его содержимое будет тем же самым.

Какой бы подход вы ни выбрали, вы можете сохранить штамп изменения (или хэш содержимого) во время генерации с помощью IResource#setPersistentProperty(), а затем сравнить его с текущей меткой изменения. Персистентные свойства хранятся на диске с метаданными платформы и поддерживаются при остановке и перезагрузке платформы.

+0

Привет @ Рюдигер, спасибо за предложение. Сборник сообщений не будет работать, потому что контент изменяется, поскольку при изменении пользователем происходит несколько изменений параметров. Поэтому, даже если содержимое файла не изменилось, сравнение завершится неудачно, потому что сгенерированный контент может отличаться. Однако, я не понимаю, как в этом случае поможет штамп изменений? Как узнать, были ли файлы изменены без сравнения с печатью создания? –

+0

@SengZhe Пожалуйста, см. Мой исправленный ответ. –

+0

Спасибо за предложение! Я не знал о методе setPersistentProperty для IResource. Действительно полезное знание. В моей следующей реализации будет использоваться решение хэш-содержимого. Пока, filestate решает мою проблему, но спасибо за советы! –

0

Я нашел ответ:

private boolean isModified(IFile existingFile) throws CoreException { 
    IFileState[] history = existingFile.getHistory(NullProgessMonitor); 
    return history.length > 0; 
} 

Эта функция поддерживается Eclipse IDE, так что переживет перезапуск затмения. Если файл был создан без изменений, состояние истории равно нулю.

Вы можете очистить местную историю, выполнив:

existingFile.clearHistory(NullProgessMonitor); 
+0

Локальная история ресурсов не предназначена для отслеживания изменений ресурсов. Он должен находиться под контролем пользователей, который указывает, если вообще и как долго сохраняется история ресурса. Более того, очистка истории приведет к нарушению определенных функций, таких как «Сравнить с историей» и т. Д. –

Смежные вопросы