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
Chamar o FindAndLockDocument método para determinar qual objeto de buffer de texto está associado ao seu arquivo aberto.
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.
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).
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.
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.
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.