为什么FileSystemWatcher从未在打开的BDE / Paradox数据库文件中发生更改?

时间:2018-05-31 04:59:22

标签: c# .net file-watcher bde paradox

我有一个用Borland Delphi编写的旧的本机应用程序:

enter image description here

应用程序与特殊硬件接口,并在.db文件中的BDE / Borland Paradox数据库中创建/存储其数据。我不是这个应用程序的作者,创建它的公司早已不复存在。

我需要为此应用程序添加一些自定义功能,即能够在发生某些与硬件相关的事件时读取数据库。我发现了一个旧的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上完成了所有这些工作。

1 个答案:

答案 0 :(得分:0)

BDE是一个奇怪且令人沮丧的软件。我并不感到惊讶,虽然FileSystemWatcher没有看到任何更改,但复制logfile.db 显示更改。

BDE执行写入缓存,默认情况下它已打开。要关闭它,请尝试以下任一方法:

  1. 使用BDE管理员小程序修改IDAPI32.CNFIDAPI32.CFG文件,将LOCAL SHARE设置为TRUE。
  2. 或者,

    1. 修改运行BDE的计算机的注册表:[HKEY_LOCAL_MACHINE \ SOFTWARE \ Borland \ Database 发动机\设置\ SYSTEM \ INIT] LOCAL SHARE = TRUE