C# 为什么打开的BDE/Paradox数据库文件中的更改从未触发FileSystemWatcher?
我有一个用Borland Delphi编写的旧本地应用程序: 应用程序与特殊硬件接口,并在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文件的时刻。因此,我决定在我的测试应用程序
.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
- 我等待硬件事件在相关应用程序中注册
- 我的测试应用程序没有看到任何更改
- 然后,在应用程序和测试应用程序仍在运行的情况下复制
文件,然后在笔记本电脑中用Paradox db viewer打开它。它会显示数据库中的新条目logfile.db
FileSystemWatcher
没有捕捉到正在更改的logfile.db
文件呢
另外,我在64位版本的Windows 7 Pro上完成了所有这些操作。BDE是一款奇怪且令人沮丧的软件。虽然
FileSystemWatcher
没有看到任何更改,但复制logfile.db
确实显示了更改,这并不奇怪
BDE执行写缓存,默认情况下处于启用状态。要关闭它,请尝试以下方法之一:
IDAPI32.CNF
或IDAPI32.CFG
文件,将本地共享设置为TRUE这可能与你有关:文件的最后一次写入更改了吗?@SamAxe:Hmm。很有趣。我也找到了。我需要检查一下。但我不确定提议的解决方案是什么?那么我必须在计时器上刷新磁盘吗?目录条目保证只有在句柄关闭时才会更新。FileSystemWatcher查找目录项的更改。@RaymondChen:那么,在这种情况下,我还有什么其他选项可以跟踪更改?(我不喜欢在重复计时器上读取/轮询该数据库文件。)这是1和2 and或or选项吗?我想我不知道BDE管理小程序是什么。我宁愿试着在登记处做这件事。尽管我真的很想在不对目标应用程序/环境进行任何修改的情况下解决这个问题。感谢您的澄清。我明天试试,然后回来汇报。我不想在这么晚的时候弄乱硬件:)克里斯,忘了更新这篇文章了。我检查了BDE的安装,注册表中的
本地共享
值已设置为TRUE
。