2012-02-14 5 views
3

나는 추가, 제거, 이름 바꾸기 및 이동 후에 javascript 파일에서 작업을 수행하는 Visual Studio 추가 기능을 작성하고 있습니다. 처음 3 개 이벤트의 그 라인을 따라, ProjectItemsEvents 클래스에 의해 노출되는 :Visual Studio에서 파일 이동 작업을 감지하는 방법이 있습니까?

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을 청취해야한다.

또한 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 전문가의 경우 적어도 다른 프로젝트에 존재하기 때문에 Create/Change/Delete 이벤트의 적절한 패턴을 파악하는 것이 다소 까다 롭습니다. 파일 이동에 대한 내 관찰에서 create 이벤트가 먼저 트리거되고 두 개의 change 이벤트가 이어지고 마지막으로 delete 이벤트가 발생합니다. 그러나 때로는 다른 시간에 대상 디렉터리에 대한 다른 업데이트 이벤트가 발생하는 것을 관찰했습니다.

관련 문제