Compartilhar via


Como: suprimir as notificações de alteração de arquivo

Quando o arquivo físico que representa o buffer de texto tiver sido alterado, uma caixa de diálogo exibe a mensagem você deseja salvar as alterações para os seguintes itens? Isso é conhecido como a notificação de alteração de arquivo. Se muitas alterações vai ser para o arquivo, no entanto, essa caixa de diálogo exibindo repetidamente pode rapidamente se tornar incômoda.

Programaticamente, você pode suprimir esta caixa de diálogo usando o procedimento a seguir. Fazendo isso, você pode recarregar um arquivo imediatamente sem ter que solicitar ao usuário para salvar as alterações de cada vez.

Para suprimir a notificação de alteração de arquivo

  1. Chamar o FindAndLockDocument método para determinar qual objeto de buffer de texto está associado ao seu arquivo aberto.

  2. Direto a VsTextBuffer objeto que está na memória para ignorar monitorando as alterações do arquivo obtendo o IVsDocDataFileChangeControl de interface da VsTextBuffer objeto (documento de dados) e, em seguida, Implementando o IgnoreFileChanges método com o fIgnore parâmetro definido como true.

  3. Chamar os métodos na IVsTextLines e o IVsTextBuffer interfaces para atualizar a memória no VsTextBuffer o objeto com as alterações de arquivo (por exemplo, quando um campo é adicionado ao seu componente).

  4. Atualize o arquivo no disco, com as alterações, sem considerar qualquer pendente edições, que o usuário pode ter em andamento.

    Dessa forma, quando você direciona o VsTextBuffer notificações de alteração de objeto para reiniciar o monitoramento para o arquivo, o buffer de texto na memória reflete as alterações que você gerou, bem como todas as outras edições pendentes. O arquivo no disco reflete o código mais recente gerado por você e alterações pelo usuário salvos anteriormente no código do usuário tenha editado.

  5. Chamar o IgnoreFileChanges método para notificar o VsTextBuffer o objeto para reiniciar o monitoramento para notificações de alteração de arquivo, definindo a fIgnore parâmetro para false.

  6. Se você planeja fazer várias alterações no arquivo, como no caso do controle de código fonte (SCC), você deve informar o serviço de alteração de arquivo global para suspender temporariamente as notificações de alteração de arquivo.

    Por exemplo, se você reescrever o arquivo e, em seguida, altere o carimbo de hora, você deve suspender as notificações de alteração de arquivo, como as operações de reconfiguração e timestample, cada um contam enquanto o evento de alteração de um arquivo separado. Para habilitar a notificação de alteração de arquivo global em vez disso, você deve chamar o IgnoreFile método.

Exemplo

A seguir demonstra como suprimir a notificação de alteração de arquivo.

//Misc. helper classes
 
CSuspendFileChanges::CSuspendFileChanges(
    /* [in] */ const CString& strMkDocument, 
    /* [in] */ BOOL fSuspendNow /* = TRUE */) 
:
    m_strMkDocument(strMkDocument),
    m_fFileChangeSuspended(FALSE)
{
    if(fSuspendNow)
        Suspend();
}
CSuspendFileChanges::~CSuspendFileChanges()
{
    Resume();
}
void CSuspendFileChanges::Suspend()
{
    USES_CONVERSION;
 
    // Prevent suspend from suspending more than once.
    if(m_fFileChangeSuspended)
        return;
 
    IVsRunningDocumentTable* pRDT = 
      _VxModule.GetIVsRunningDocumentTable();
    ASSERT(pRDT);
    if (!pRDT)
        return;
 
    CComPtr<IUnknown> srpDocData;
    VSCOOKIE vscookie = VSCOOKIE_NIL;
    pRDT->FindAndLockDocument(RDT_NoLock, T2COLE(m_strMkDocument),  
      NULL, NULL, &srpDocData, &vscookie);
    if ( (vscookie == VSCOOKIE_NIL) || !srpDocData)
        return;
    CComPtr<IVsFileChangeEx> srpIVsFileChangeEx;
    HRESULT hr = _VxModule.QueryService(SID_SVsFileChangeEx, 
      IID_IVsFileChangeEx, (void **)&srpIVsFileChangeEx);
    if (SUCCEEDED(hr) && srpIVsFileChangeEx)
    {
        m_fFileChangeSuspended = TRUE;
        srpIVsFileChangeEx->IgnoreFile(NULL, m_strMkDocument, TRUE); 
        srpDocData->QueryInterface(IID_IVsDocDataFileChangeControl, 
          (void**)&m_srpIVsDocDataFileChangeControl);
        if(m_srpIVsDocDataFileChangeControl)
            m_srpIVsDocDataFileChangeControl->IgnoreFileChanges(TRUE);
    }
}
void CSuspendFileChanges::Resume()
{
    if(!m_fFileChangeSuspended)
        return;
 
    CComPtr<IVsFileChangeEx> srpIVsFileChangeEx;
    HRESULT hr = _VxModule.QueryService(SID_SVsFileChangeEx, 
      IID_IVsFileChangeEx, (void **)&srpIVsFileChangeEx);
    if (SUCCEEDED(hr) && srpIVsFileChangeEx)
 
    srpIVsFileChangeEx->IgnoreFile(NULL, m_strMkDocument, FALSE); 
    if(m_srpIVsDocDataFileChangeControl)
        m_srpIVsDocDataFileChangeControl->IgnoreFileChanges(FALSE);
    m_fFileChangeSuspended = FALSE;
    m_srpIVsDocDataFileChangeControl.Release();
}
// Misc. helper classes

Programação robusta

Se o seu caso envolve várias alterações no arquivo, como no caso do SCC, é importante retomar as notificações de alteração do arquivo global antes de alertar os dados dos documentos para reiniciar o monitoramento de alterações do arquivo.