2012-02-09 10 views
5

¿Utiliza la marca de tiempo de modificación o/y comprueba si el contenido real ha cambiado (por ejemplo, comparando la suma de comprobación)?¿Cómo determina MS Visual Studio que el archivo fuente ha cambiado?

Editar: Necesito saber esto porque utilizo Git para el control de código fuente y con frecuencia cambio de ramas. Parece que a veces incluso si cambio la rama hacia atrás y fuerza (por ejemplo desde desarrollar a maestro y luego de vuelta a desarrollar), el VS reconstruye la mitad de los archivos de fuentes. Me pregunto por qué sucede esto y por qué sucede a veces y no sucede las otras veces.

+0

¿Qué versión de VS es esto? Qué idioma estás usando? –

+0

@ConradFrix VS2008, C++. –

+5

Aquellos que votan para cerrar - las herramientas de programación están [en el tema] (http://www.stackoverflow.com/faq) en SO :) –

Respuesta

5

Dado que Visual Studio es un proyecto de código cerrado, apuesto a que solo los desarrolladores podrán dar una respuesta definitiva sobre cómo funciona exactamente. Sin embargo, para mis propósitos, es suficiente para probar algunos escenarios.

Lo he probado con una pequeña solución y un par de archivos (un encabezado y dos archivos de origen). Los resultados de la prueba llevan a la siguiente conclusión. Visual Studio busca la fecha y la hora de modificación. Incluso si el contenido del archivo es el mismo, compila este archivo y también cualquier otro archivo que lo incluya. Si la fecha y la hora de modificación son las mismas, no se volverá a compilar aunque el contenido sea diferente. Visual Studio ignora la creación y accede a las fechas y horas.

+0

¡Excelente para saber! –

+0

Acabo de hacer algunas de mis propias pruebas porque quería saber si se mantuvo el tiempo * modificado por archivo * o * por compilación *. Según mis pruebas, parece que solo conserva la última hora de compilación y luego la compara con la última hora de modificación de un archivo. Por lo tanto, solo se volverá a compilar si el tiempo modificado del archivo avanza más allá del último tiempo de compilación. Incluso si avanza pero no lo suficiente, no se volverá a compilar. –

2

Supongo que usa FileSystemWatcher en los directorios del proyecto y archivos vinculados (si corresponde), simplemente porque es la manera correcta de hacer este tipo de cosas.

algunas google encuentra para más información sobre esta clase (o simplemente mirar hacia arriba a sí mismo):

Por supuesto, cuando el archivo de origen está abierto, su contenido por el tiempo de edición, así como cualquier cambio de usuario (incluso no guardado) se cargan en la RAM, pero no se compara con el contenido del disco (que sería demasiado lento), escucha un evento del sistema cuando el sistema dice que el archivo ha cambiado.

Actualización:

no

Probablemente esa clase itslf, pero la versión Win32 de ella, que conocía a la mayoría de las clases de funcionalidad .NET relacionados con el sistema son sólo envoltorios de Win32.

De esta Stackoverflow respuesta: How does FileSystemWatcher work on another computers directory?
Creo que envuelve esta API (no estoy seguro): http://msdn.microsoft.com/en-us/library/aa365465.aspx

Actualización 2:

Este es el enfoque de Microsoft para monitorear los cambios del archivo:
http://msdn.microsoft.com/en-us/library/chzww271(v=vs.80).aspx

Actualización 3

Esta es una respuesta anterior, y se mencionó anteriormente que fue una suposición, ya que Visual Studio es de código cerrado como se menciona en otras respuestas. Vale la pena mencionar que la respuesta aceptada sugiere que Visual Studio busca fechas de modificación de archivo, lo que sugiere que no utiliza el enfoque adivinado en esta misma respuesta, y que fue incorrecto.

Espero que al lector no le importe el esfuerzo dado para racionalizar las posibilidades en esta respuesta (causando incomodidad al lector o bajando los votos). Manteniéndolo solo por razones de archivo.

+1

¿No es VS principalmente Win32, además de los componentes de la interfaz de usuario WPF de 2010? –

+0

Correcto, solo estaba pensando en el enfoque en general. E incluso esta clase .NET es probable (como otras) solo un contenedor Win32. Notas aplicadas para publicar la actualización. – Meligy

+0

Esta respuesta ilustra por qué las preguntas que requieren especulación no son constructivas ... ¿cuál es el punto de * adivinar * qué VS usa para hacer esto? –

Cuestiones relacionadas