Почему FileSystemWatcher никогда не запускается при изменениях в открытом файле базы данных BDE / Paradox? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть старое родное приложение, написанное на Borland Delphi:

enter image description here

Приложение взаимодействует со специальным оборудованием и создает / сохраняет свои данные вБаза данных BDE / Borland Paradox в файле .db.Я не являюсь автором этого приложения, и компания, которая его создала, давно ушла.

Мне нужно добавить некоторые пользовательские функции в это приложение, а именно, чтобы иметь возможность читать базу данных, когда определенное оборудование связанособытие происходит.Я нашел старую библиотеку C, которая позволяет мне читать файл .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.

1 Ответ

0 голосов
/ 31 мая 2018

BDE - странное и разочаровывающее программное обеспечение для работы.Меня не удивляет, что, хотя FileSystemWatcher не видит никаких изменений, при копировании logfile.db отображаются изменения.

BDE выполняет кэширование при записи и включено по умолчанию.,Чтобы отключить его, попробуйте один из следующих способов:

  1. Используйте апплет BDE Administrator для изменения файла IDAPI32.CNF или IDAPI32.CFG, установив для ЛОКАЛЬНОГО ПОДЕЛКА значение ИСТИНА.

Или,

Изменить реестр для компьютера, на котором запущен BDE: [HKEY_LOCAL_MACHINE \ SOFTWARE \ Borland \ Database Engine \ Settings \ SYSTEM \ INIT] LOCAL SHARE = ​​TRUE
...