3

我们有一个使用 BDE 的遗留应用程序。(考虑到它的年龄,BDE 继续工作得非常好)。

有时我们的应用程序需要操作文件夹(重命名、移动等),但 .NET 或 .LCK 文件在文件夹中保持打开状态,从而阻止了这种情况。我们一直无法在我们的代码中找到任何仍然打开的表或查询。

除了让我们的程序外壳连接到非 BDE 程序并自行终止之外,我们是否有一种编程方式来关闭 BDE,从而解锁这些文件。

标准免责声明:是的,BDE 已死。是的,我们应该迁移到更现代的数据库。是的,总有一天 BDE 将不再工作。由于有近 200 万行遗留代码,迁移(即使使用像 Sybase Advantage 这样的插件兼容平台)并不是一个廉价的项目,这就是为什么我们还没有这样做的原因......

4

2 回答 2

2

您通常不需要为关闭 BDE 做任何具体的事情。
所有 BDE 会话都在 DBTables 的 Finalization 部分中释放。DbiDLLExit这将关闭所有内容,并且当 Default Session 也被销毁时,如果需要,它将DbiExit从 BDE 单元调用 then 。

现在,如果你想在之前关闭 BDE ,我建议你模仿 DBTables 的最终确定和初始化部分(免责声明:有限的测试,小心使用......),如:

procedure BDEKill;
begin
// from finalization
  Sessions.Free;
  Sessions := nil;
end;

procedure BDEReStart;
begin
// from initialization
  Sessions := TSessionList.Create;
  Session := TSession.Create(nil);
  Session.SessionName := 'Default'; { Do not localize }
end;

并像这样使用它:

BDEKill;
try
  // move my folders
finally
  BDEReStart;
end;
于 2012-04-19T17:55:20.400 回答
1

解锁文件是您的问题的另一种可能(极端)解决方案:

建议你研究一下opc0de的File Unlock源码。


报价

一个文件经常不能被删除,因为它正在被另一个应用程序使用。此工具允许您解锁该文件以进行删除。


外观和感觉:

通过 opc0de 解锁文件


特征:

  • 解锁文件
  • 解锁和删除文件
  • 查看哪些进程使用该文件
  • 终止使用该文件的进程

下载链接:

于 2012-04-19T19:13:46.107 回答