У меня есть старое родное приложение, написанное на Borland Delphi:
Приложение взаимодействует со специальным оборудованием и создает / сохраняет свои данные в базе данных BDE / Borland Paradox в .db
файле. Я не являюсь автором этого приложения, и компании, которая его создала, давно нет.
Мне нужно добавить в это приложение некоторые настраиваемые функции, а именно, чтобы иметь возможность читать базу данных при возникновении определенного события, связанного с оборудованием. Я нашел старую библиотеку C, которая позволяет мне читать файл paradox .db. Итак, эта часть закрыта.
Сейчас я пытаюсь найти способ отследить момент записи этим приложением в свой .db
файл. Поэтому я решил попробовать в своем тестовом приложении следующее:
static void Main(string[] args)
{
string path = "C:\\Program Files\\Company Name\\logfile.db";
string strDirName = Path.GetDirectoryName(path);
string strFileName = Path.GetFileName(path);
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = strDirName;
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
watcher.Filter = strFileName; // "*.db";
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.Error += new ErrorEventHandler(OnError);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Starting the watch...");
Console.WriteLine("Folder: " + watcher.Path);
Console.WriteLine("File: " + watcher.Filter);
while (true)
{
watcher.WaitForChanged(WatcherChangeTypes.All);
Console.WriteLine("-next-");
}
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("-\"" + e.FullPath + "\", type=" + e.ChangeType + ", time=" + DateTime.Now);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine("-\"{0}\" renamed to \"{1}\"", e.OldFullPath, e.FullPath);
}
private static void OnError(object source, ErrorEventArgs e)
{
Console.WriteLine("#error: \"" + e.ToString() + "\", time=" + DateTime.Now);
}
Проблема в том, что он не видит никаких изменений в базе данных.
Если я протестирую его с файлом .txt, открыв его в Блокноте, а затем сохранив с некоторыми изменениями, он будет работать нормально. Но не с приложением, которое мне нужно.
Вот откуда я знаю, что это не работает:
Данное приложение уже запущено.
Я запускаю свое приложение рядом с ним. Он не показывает ошибок или исключений. Итак, я знаю, что моя функция
watcher.WaitForChanged
началась.Я жду, пока аппаратное событие не будет зарегистрировано в рассматриваемом приложении.
Мое тестовое приложение не видит изменений.
Затем я копирую файл
logfile.db
, пока приложение и мое тестовое приложение все еще работают, а затем открываю его на своем ноутбуке с помощью средства просмотра Paradox DB. И он показывает новую запись в базе данных.
Так почему же FileSystemWatcher
не улавливает, что logfile.db
файл изменяется?
PS. Все это я делаю на 64-битной версии Windows 7 Pro.
CreateFileW
иCloseHandle
в файле, который отслеживается на предмет изменений из рабочего потока в моем процессе. К сожалению, в данном случае это ничего не изменило. Изменение в этом файле было обнаружено только тогда, когда я закрыл его в программе просмотра Paradox DB. Я также пытаюсь открыть том, где находился файл, и очистить его (например, было предлагается здесь), но это тоже не помогло :( - person c00000fd   schedule 12.06.2018procmon
на нем. Вот снимок экрана с результатом. Однако у меня странное поведение. Всякий раз, когда происходит событие, которое я хочу перехватить, он открывает этотlogbase.db
файл несколько раз, а затем закрывает его. Так что, черт возьми, я позволил своему тестирующему приложению немного поработать само по себе (с вашим предложением открыть и закрыть файлlogbase.db
из рабочего потока). К моему удивлению, когда я проверил позже, я понял, что оно поймал некоторые события. Я не уверен, почему? - person c00000fd   schedule 12.06.2018logbase.db
). Я заметил, что всякий раз, когда я получаю сразу несколько аппаратных событий / входов в систему (4 или 5 подряд), которые генерируют повторяющиеся события записи к отслеживаемому файлуFileSystemWatcher
, кажется, улавливает их (вместе с методом вашего рабочего потока). Но не отдельные события. - person c00000fd   schedule 12.06.2018