2012-02-14 10 views
3

ビジュアルスタジオアドインを作成しています。追加、削除、名前変更、移動後にビジュアルスタジオアドインを作成しています。最初の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イベントが発生するようには見えません。

誰かがファイル移動イベントを検出する方法について知っていますか?

答えて

1

FileSystemWatcherを使用して、ソリューションのディレクトリを自分で監視できます。ファイルを移動するときには、Deletedイベントとそれに続くCreatedイベントが発生するはずです。

+0

ここでは完全には機能しません。 Visual Studioのプロジェクト項目には必ずしも実際のバッキングファイルがありません。メモリ内/デザイナで生成されたアイテムになる可能性があります – JaredPar

+0

@JaredPar OPにjsファイルが記述されているので、これらは物理ファイルだと思います。 –

+0

一般的にはそうです。 – JaredPar

2

私はファイル移動アクションを検出するのに適した方法を見つけました。

あなたはまず、IVsSolutionEventsを実装することにより、あなたのPackageコード内の溶液内のプロジェクトのための項目の変更イベントをサブスクライブIVsSolution.AdviseSolutionEventsを使用し、OnAfterOpenProjectに耳を傾ける必要があります。

​​も実装してください。 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プロフェッショナルでは異なるものが存在するため、Create/Change/Deleteイベントの適切なパターンを把握するのはやや難解でした。ファイルが移動されたという私の見解から、createイベントが最初にトリガされ、続いて2つのchangeイベント、そして最後にdeleteイベントがトリガされます。しかし、時には、別の時に宛先ディレクトリに対して別の更新イベントが発生することも観察しました。

関連する問題