【问题标题】:Is there a way to detect file move operation from a visual studio add in有没有办法从 Visual Studio 插件中检测文件移动操作
【发布时间】:2012-02-14 08:16:50
【问题描述】:

我正在编写一个 Visual Studio 插件,它在添加、删除、重命名和移动 javascript 文件后执行操作。前 3 个事件由 ProjectItemsEvents 类公开,大致如下:

this._applicationObject = (DTE2)application;
this._addInInstance = (AddIn)addInInst;

this.events = _applicationObject.Events as Events2;
this.projectItemsEvents = events.ProjectItemsEvents;
this.projectItemsEvents.ItemRenamed += ProjectItemRenamed;

但是,似乎没有一种方法可以检测文件何时移动,例如在解决方案文件夹之间移动。执行这样的操作甚至不会像我预期的那样导致 ItemRemoved 和 ItemAdded 事件。

有人知道我应该如何检测文件移动事件吗?

【问题讨论】:

    标签: c# visual-studio-addins


    【解决方案1】:

    在研究了一段时间后,我找到了一种检测文件移动操作的合适方法。

    您应该首先通过实现IVsSolutionEvents,在Package 代码中订阅解决方案内项目的项目更改事件,使用IVsSolution.AdviseSolutionEvents,然后收听OnAfterOpenProject。

    您还应该实现IVsHierarchyEvents 并订阅例如OnItemAdded 和 OnItemDeleted 事件通过调用 IVsHierarchy.AdviseHierarchyEvents。文件移动可以通过后续出现的 OnItemAdded 和 OnItemDeleted 来检测:

    public class MyVsHierarchyEvents : IVsHierarchyEvents
    {
       public int OnItemAdded( uint itemidParent, uint itemidSiblingPrev, uint itemidAdded )
       {
          object itemAddedExtObject;
          if ( m_hierarchy.GetProperty( itemidAdded, (int)__VSHPROPID.VSHPROPID_ExtObject, out itemAddedExtObject ) == VSConstants.S_OK )
          {
             var projectItem = itemAddedExtObject as ProjectItem;
             if ( projectItem != null )
             {
                // do something here ...
             }
          }
          return VSConstants.S_OK;
       }
    
       public int OnItemDeleted( uint itemid )
       {
          object itemExtObject;
          if ( m_hierarchy.GetProperty( itemid, (int)__VSHPROPID.VSHPROPID_ExtObject, out itemExtObject ) == VSConstants.S_OK )
          {
             var projectItem = itemExtObject as ProjectItem;
             if (projectItem != null)
              {
                 // do something here ...
              }
          }
          return ret;
       }
       // handle other events ...
    }
    public class MySolutionEvents : IVsSolutionEvents
    {
       IVsHierarchyEvents m_myVsHierarchyEvents;
       uint m_cookie;
       public int OnAfterOpenProject( IVsHierarchy pHierarchy, int fAdded )
       {
           m_myVsHierarchyEvents = new MyVsHierarchyEvents();
           pHierarchy.AdviseHierarchyEvents( m_myVsHierarchyEvents, out m_cookie );
           // do other things here ...
           return VSConstants.S_OK;
       }
       // handle other events ...
    }
    public class MyPackage : Package
    {
       IVsSolutionEvents m_vsSolutionEvents;
       IVsSolution m_vsSolution;
       uint m_SolutionEventsCookie;
       protected override void Initialize()
       {
          m_vsSolutionEvents = new MySolutionEvents();
          m_vsSolution = GetService( typeof( SVsSolution ) ) as IVsSolution;
          m_vsSolution.AdviseSolutionEvents( m_vsSolutionEvents, out m_SolutionEventsCookie );
       }
    }
    

    注意:

    按照 vc 74 的建议,我还使用 FileSystemWatcher 创建了一个检测器。然而,找出合适的创建/更改/删除事件模式有点棘手,因为至少在 VS 2010 专业版中存在不同的事件,这些事件发生在文件在项目中移动后发生。根据我对文件移动的观察,首先触发创建事件,然后是两个更改事件,最后是一个删除事件。但是,我也观察到有时目标目录会在不同的时间发生另一个更新事件。

    【讨论】:

      【解决方案2】:

      您可以使用FileSystemWatcher 自己监控解决方案的目录。移动文件时,它应该触发 Deleted 事件,然后触发 Created 事件。

      【讨论】:

      • 这里不能完全工作。 Visual Studio 中的项目项不一定有真正的支持文件。它可能是内存中/设计器生成的项目
      • @JaredPar OP提到了js文件,所以我认为这些是物理文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2011-08-10
      • 2014-08-05
      • 2020-08-19
      • 2011-02-09
      • 2022-11-22
      相关资源
      最近更新 更多