如何检测待保存的文件?

How to detect files pending save?

提问人:Jabu 提问时间:8/21/2023 更新时间:8/21/2023 访问量:119

问:

我正在尝试遵循谢尔盖对同一问题的评论,即如何检测具有“待处理保存状态”的文件。

法典:

using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;

namespace Link
{
    public static class ProjectHelpers
    {
        static ProjectHelpers()
        {
            // Rely on caller being on UI thread as shouldn't do it here in the constructor.
#pragma warning disable VSTHRD010 // Invoke single-threaded types on Main thread
            Dte = (DTE)Package.GetGlobalService(typeof(DTE));
#pragma warning restore VSTHRD010 // Invoke single-threaded types on Main thread
            Dte2 = (DTE2)Package.GetGlobalService(typeof(DTE));
        }

        public static DTE Dte { get; }

        public static DTE2 Dte2 { get; }
    }
}

然后我将 Dte.Documents 称为:

try
{
      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

      // Enumerate through open documents
      foreach (Document doc in ProjectHelpers.Dte.Documents)
      {
         // Check if the document has unsaved changes
         if (!doc.Saved)
         {
            Console.WriteLine($"Unsaved changes in document: {doc.FullName}");
         }
      }
}
catch (Exception ex)
{
      Console.WriteLine(ex.Message);
}

但是我得到了这个例外:

The data necessary to complete this operation is not yet available. (Exception from HRESULT: 0x8000000A)

我错过了什么?

C# visual-studio visual-studio-extensions

评论

0赞 Ralf 8/21/2023
正如 hresult 所建议的那样,当文档列表或完整的 DTE 子系统尚未准备就绪时,您可能会调用它。因此,问题的一部分可能在于“何时”这样做。这是否已经在 VS 启动例程中调用?
0赞 Alessandro D'Andria 8/21/2023
我怀疑在一切准备就绪之前调用了静态构造函数。ProjectHelpers
0赞 Jabu 8/22/2023
@Ralf我尝试用快捷方式调用它,但只有 Works 没有。ProjectHelpers.Dte.ActiveDocument.Documents
0赞 Jabu 8/22/2023
@AlessandroD'Andria 它没有,正如我在上面的评论中提到的,我能够正确使用。dte
0赞 Bowman Zhu-MSFT 9/5/2023
这与实例化的顺序有什么关系吗?

答: 暂无答案