我有一个用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查看器打开它。它显示了数据库中的新条目。
那么为什么FileSystemWatcher
没有抓住logfile.db
文件被更改?
PS。我在64位版本的Windows 7 Pro上完成了所有这些工作。
答案 0 :(得分:0)
BDE是一个奇怪且令人沮丧的软件。我并不感到惊讶,虽然FileSystemWatcher
没有看到任何更改,但复制logfile.db
会显示更改。
BDE执行写入缓存,默认情况下它已打开。要关闭它,请尝试以下任一方法:
IDAPI32.CNF
或IDAPI32.CFG
文件,将LOCAL SHARE设置为TRUE。或者,