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

C# 为什么打开的BDE/Paradox数据库文件中的更改从未触发FileSystemWatcher?,c#,.net,file-watcher,bde,paradox,C#,.net,File Watcher,Bde,Paradox,我有一个用Borland Delphi编写的旧本地应用程序: 应用程序与特殊硬件接口,并在.db文件中的BDE/Borland Paradox数据库中创建/存储其数据。我不是此应用程序的作者,创建此应用程序的公司早已不复存在 我需要向这个应用程序添加一些自定义功能,也就是说,当某个硬件相关事件发生时,能够读取数据库。我发现了一个旧的C库,它允许我读取paradox.db文件。所以这一部分被涵盖了 我现在要做的是找到一种方法来跟踪这个应用程序写入其.db文件的时刻。因此,我决定在我的测试应用程序

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

应用程序与特殊硬件接口,并在
.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 viewer打开它。它会显示数据库中的新条目

那么为什么
FileSystemWatcher
没有捕捉到正在更改的
logfile.db
文件呢


另外,我在64位版本的Windows 7 Pro上完成了所有这些操作。

BDE是一款奇怪且令人沮丧的软件。虽然
FileSystemWatcher
没有看到任何更改,但复制
logfile.db
确实显示了更改,这并不奇怪

BDE执行写缓存,默认情况下处于启用状态。要关闭它,请尝试以下方法之一:

  • 使用BDE管理员小程序修改
    IDAPI32.CNF
    IDAPI32.CFG
    文件,将本地共享设置为TRUE
  • 或者

  • 修改运行BDE的计算机的注册表:[HKEY\U LOCAL\U machine\SOFTWARE\Borland\Database 引擎\设置\系统\初始化] 本地共享=真

  • 这可能与你有关:文件的最后一次写入更改了吗?@SamAxe:Hmm。很有趣。我也找到了。我需要检查一下。但我不确定提议的解决方案是什么?那么我必须在计时器上刷新磁盘吗?目录条目保证只有在句柄关闭时才会更新。FileSystemWatcher查找目录项的更改。@RaymondChen:那么,在这种情况下,我还有什么其他选项可以跟踪更改?(我不喜欢在重复计时器上读取/轮询该数据库文件。)这是1和2 and或or选项吗?我想我不知道BDE管理小程序是什么。我宁愿试着在登记处做这件事。尽管我真的很想在不对目标应用程序/环境进行任何修改的情况下解决这个问题。感谢您的澄清。我明天试试,然后回来汇报。我不想在这么晚的时候弄乱硬件:)克里斯,忘了更新这篇文章了。我检查了BDE的安装,注册表中的
    本地共享
    值已设置为
    TRUE