私はファイル移動アクションを検出するのに適した方法を見つけました。
あなたはまず、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イベントがトリガされます。しかし、時には、別の時に宛先ディレクトリに対して別の更新イベントが発生することも観察しました。
ここでは完全には機能しません。 Visual Studioのプロジェクト項目には必ずしも実際のバッキングファイルがありません。メモリ内/デザイナで生成されたアイテムになる可能性があります – JaredPar
@JaredPar OPにjsファイルが記述されているので、これらは物理ファイルだと思います。 –
一般的にはそうです。 – JaredPar