В настоящее время я пишу некоторые фоновые процессы для веб-сайта, которые будут запускаться в ночное время на веб-сервере.
Моя основная проблема заключается в том, что мне нужно определить, изменился ли файл изображения за последние 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-часового периода?
Любая помощь будет принята с благодарностью.
Для этого приложения с длительной страницей вам нужно будет хранить базу данных, содержащую информацию о старых файлах. Один из способов сделать это - сохранить MD5 каждого файла, а затем сравнить и скопировать вещи, которые были изменены.
using (var md5 = MD5.Create())
using (var stream = File.OpenRead(filename)) {
return Convert.ToBase64String(md5.ComputeHash(stream));
}
Это дает дополнительное преимущество, позволяя вам синхронизировать, даже если какая-то проблема означает, что ваша "домашняя работа" не запускается за одну ночь, что неизбежно произойдет!
Если у вас нет другого программного обеспечения, использующего атрибут файла архива, он будет работать так, как вам нужно, - если вы скопировали файл в другое место, отключите атрибут архива. Перезапись файла из другого каталога сбрасывает его!
// 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);
(Неиспользованный код, если у вас есть проблема, дайте мне знать, я посмотрю на него, но я проверил поведение бит архива, и он делает то, что вы хотите).