Определить, был ли файл перезаписан (переместить и заменить) с помощью C #

1

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

Моя основная проблема заключается в том, что мне нужно определить, изменился ли файл изображения за последние 24 часа. Я думал, что это будет легко достижимо, используя следующий код:

DateTime lastWrite = System.IO.File.GetLastWriteTimeUtc(HttpContext.Current.Server.MapPath(image.FileName));

if (lastWrite > DateTime.UtcNow.AddHours(-24) && lastWrite < DateTime.UtcNow)
{
    var a = "This item has been modified";
}
else
{
    var b = "This item has not been modified";
}

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

Поэтому мой вопрос заключается в том, как определить, действительно ли файл (главным образом изображения) был изменен (отредактирован, скопирован, удален и заменен) в течение 24-часового периода?

Любая помощь будет принята с благодарностью.

  • 0
    Используйте GetCreationTimeUtc () для работы с Cut & Paste.
  • 0
    Это не обнаружит Cut & Paste, если каталог, в который вы вставляете файл, уже имеет файл с тем же именем. Если вы используете параметр «Переместить и заменить», время создания не изменится.
Показать ещё 4 комментария
Теги:
file
filesystems

2 ответа

2
Лучший ответ

Для этого приложения с длительной страницей вам нужно будет хранить базу данных, содержащую информацию о старых файлах. Один из способов сделать это - сохранить MD5 каждого файла, а затем сравнить и скопировать вещи, которые были изменены.

using (var md5 = MD5.Create())
using (var stream = File.OpenRead(filename)) {
    return Convert.ToBase64String(md5.ComputeHash(stream));
}

Это дает дополнительное преимущество, позволяя вам синхронизировать, даже если какая-то проблема означает, что ваша "домашняя работа" не запускается за одну ночь, что неизбежно произойдет!

  • 0
    Это кажется лучшим ответом на данный момент. Я тщательно протестировал этот метод с использованием различных сценариев, и он кажется надежным (почти)
0

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

// Check for flag
FileAttributes attributes = File.GetAttributes(path);
bool isArchiveSet = (attributes & File.Archive) == File.Archive

// Remove archive flag
FileAttributes attributes = File.GetAttributes(path);
attributes = attributes & ~FileAttributes.Archive;
File.SetAttributes(path, attributes);

(Неиспользованный код, если у вас есть проблема, дайте мне знать, я посмотрю на него, но я проверил поведение бит архива, и он делает то, что вы хотите).

  • 0
    Это было одним из первых вещей, которые я изучил, и, к сожалению, это не сработало. Похоже, что все изображения архивируются по умолчанию в системе, которую я пробовал.
  • 0
    @jezzipin, если вы имеете в виду, что у всех файлов был установлен бит, что-то еще должно использовать атрибут (потому что это так странно - Windows автоматически устанавливает бит при каждом изменении файла, вы должны сбросить его, если вы взяли твоя копия). Возможно, вы могли бы отключить это программное обеспечение или настроить его запуск сразу же после вашей рутины?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню