【问题标题】:Checking if the file is in use and by which application?检查文件是否正在使用以及由哪个应用程序使用?
【发布时间】:2013-02-11 14:55:21
【问题描述】:

尝试使用下面提到的方法来获取有关锁定文件的更多详细信息。

Is file in use

function GetFileInUseInfo(const FileName : WideString) : IFileIsInUse;
var
  ROT : IRunningObjectTable;
  mFile, enumIndex, Prefix : IMoniker;
  enumMoniker : IEnumMoniker;
  MonikerType : LongInt;
  unkInt  : IInterface;
begin
  result := nil;

  OleCheck(GetRunningObjectTable(0, ROT));
  OleCheck(CreateFileMoniker(PWideChar(FileName), mFile));

  OleCheck(ROT.EnumRunning(enumMoniker));

  while (enumMoniker.Next(1, enumIndex, nil) = S_OK) do
  begin
    OleCheck(enumIndex.IsSystemMoniker(MonikerType));
    if MonikerType = MKSYS_FILEMONIKER then
    begin
      if Succeeded(mFile.CommonPrefixWith(enumIndex, Prefix)) and
         (mFile.IsEqual(Prefix) = S_OK) then
      begin
       if Succeeded(ROT.GetObject(enumIndex, unkInt)) then
        begin
          if Succeeded(unkInt.QueryInterface(IID_IFileIsInUse, result)) then
          begin
            result := unkInt as IFileIsInUse;
            exit;
          end;
        end;
      end;
    end;
  end;
end;

但是调用

unkInt.QueryInterface(IID_IFileIsInUse, result) 

总是返回E_NOINTERFACE

平台:Windows 7 32 位操作系统,打开 word 文件和 .msg 文件。

检查了从资源管理器打开的文件并尝试删除。它显示了有关打开文件的应用程序的正确详细信息。在我的应用程序中,我尝试显示有关打开文件的应用程序的信息。但是当尝试将指针转换为IFileIsInUse 接口时,QueryInterface 调用失败并返回代码E_NOINTERFACE,这意味着 ROT 中的对象没有实现IFileIsInUse。 AFASIK, MS Office 文件实现IFileIsInUse

知道这里有什么问题吗?

【问题讨论】:

标签: delphi delphi-2009 windows-api-code-pack


【解决方案1】:

事实上,您的代码运行良好。问题是您正在测试的程序确实没有实现IFileIsInUse。当系统返回E_NOINTERFACE 时,它是准确的。接口未实现。

我用File Is In Use Sample from the SDK 对此进行了测试。由该应用程序添加到 ROT 的文件(它确实实现了 IFileIsInUse)被您的代码拾取。而 Acrobat 8​​ 和 Word 2010 打开的文件则不然。

我由此得出的结论是,IFileIsInUse 原则上是一个好主意,但如果应用程序不支持它,它就没有多大用处。似乎有一些主要的应用程序没有。

很明显,当您发现IFileIsInUse 未实现时,您将需要使用一种或多种其他机制来检测哪个应用程序锁定了文件。

【讨论】:

  • 是的。谢谢你。当对象没有实现 IFileIsInUse 时,使用一种后备方法来获取数据。
【解决方案2】:

SysInternals Process Explorer 帮助我删除了一个锁定的 .msg 文件,该文件导致了系统问题,例如锁定桌面。

  • 运行 Process Explorer,使用“查找”菜单,
  • 输入完整路径文件名,
  • 点击搜索。

为了删除锁定的文件,我打开了一个cmd窗口,尝试del锁定的文件,但删除挂在锁上了。

然后我使用 Process Explorer 重新启动持有锁的进程 - Explorer.exe。

del 然后成功完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多