【问题标题】:programmatically check computer management - shared folders - open files for a file以编程方式检查计算机管理 - 共享文件夹 - 打开文件的文件
【发布时间】:2010-01-18 18:47:31
【问题描述】:

我们有一个需要更新的客户端服务器软件。我需要检查文件当前是否正在被访问。如果可能的话,这可能吗?我可以看到文件是否打开的唯一地方是共享文件夹下的打开文件。我试过这段代码,但只是显示文件没有打开。

function TfrmMain.FileInUse(FileName: string): Boolean;

var H_File : HFILE;
begin
  Result := False;

  if not FileExists(FileName) then
    begin
    showmessage ('Doesnt Exist');
    exit;
    end;
  H_File := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0,
    nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  Result := (H_File = INVALID_HANDLE_VALUE);
  showmessage('Opened');
  if not Result then
    CloseHandle(H_File);
end;

【问题讨论】:

  • 你提到“文件”是什么意思?
  • 一个需要更新的exe文件,所以在删除替换文件之前需要确保没有打开过。
  • @Jason:毕竟,也许你不必这样做。即使可执行文件正在使用中,您也可以替换它,请参阅stackoverflow.com/questions/277514/…
  • 我想检查 exe 是否正在运行,如果是,我将杀死它然后替换 exe。连同运行脚本和其他一些东西。它需要确保每个人都退出该计划。但是那个链接非常有帮助,谢谢。

标签: delphi client


【解决方案1】:

您可以通过 Windows 提供的 WBEM 子系统访问大量信息。我相信那里有很好的 WBEM 组件,但您也可以导入“Microsoft WMI 脚本”COM 类型库(尽管这需要一些工作来弄清楚它是如何工作的)。

如果您查询 Win32_ServerConnection 对象,您将获得当前正在使用的项目列表,就像您可以使用管理工具中的“计算机管理”工具查看一样。

【讨论】:

  • 我检查了 Win32_ServerConnection 对象,它显示了打开的文件数量,但没有显示文件的名称。
【解决方案2】:

不一定是答案,但我目前正在做类似的事情 - 因为虽然我创建了一个中间应用程序来检查文件的本地缓存副本是否是最新的,但主可执行文件可能会在工作时间更新,然后我运行这个本地缓存的副本。

【讨论】:

    【解决方案3】:

    找到this similar item,有人提议用NetFileEnum function

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2011-12-29
      相关资源
      最近更新 更多