2012-02-14 3 views
3

Я пишу визуальную студийную надстройку, которая префиксные операции над файлами 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, как я мог ожидать.

Кто-нибудь знает, как я должен искать обнаружение перенесенного файла?

ответ

1

Вы можете использовать FileSystemWatcher, чтобы самостоятельно отслеживать каталог решения. При перемещении файла он должен запустить событие Deleted, за которым следует событие Created.

+0

Это не будет работать полностью здесь. Элемент проекта в Visual Studio необязательно имеет реальный файл резервной копии. Это может быть элемент, созданный в памяти/конструкторе. – JaredPar

+0

@ JaredPar. OP упоминает файлы js, поэтому я считаю, что это физические файлы. –

+0

в целом да это правда. – JaredPar

2

После того, как я проделал некоторое время, я нашел подходящий способ для обнаружения действий перемещения файлов.

Вы должны сначала подписаться на событие изменения пункта для проектов внутри решения в вашем Package коды реализации IVsSolutionEvents, используйте 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); 
    } 
} 

Примечание:

Я также создал детектор, используя FileSystemWatcher как VC 74 предложил. Однако было сложно определить подходящие шаблоны событий Create/Change/Delete, поскольку по-разному существуют в профессионале VS 2010, которые возникают после перемещения файла внутри проекта. Из моего наблюдения за перемещаемый файл сначала запускается событие create, затем два события изменения и, наконец, событие delete. Но я также заметил, что иногда происходит другое событие обновления для каталога назначения в разное время.

 Смежные вопросы

  • Нет связанных вопросов^_^