2012-02-09 18 views
5

Utilizza il timestamp di modifica o/e controlla se il contenuto effettivo è cambiato (ad esempio confrontando il checksum)?In che modo MS Visual Studio determina che il file di origine è stato modificato?

Modifica: Ho bisogno di sapere questo poiché utilizzo Git per il controllo del codice sorgente e spesso cambio rami. A volte, anche se cambio il ramo indietro e la forza (ad esempio da sviluppo a master e quindi di nuovo a sviluppo), il VS ricostruisce la metà dei file di origine. Mi chiedo perché questo succede e perché succede a volte e non succede le altre volte.

+0

Quale versione di VS è questa? Che lingua stai usando? –

+0

@ConradFrix VS2008, C++. –

+5

Chi vota per chiudere - strumenti di programmazione sono [su argomento] (http://www.stackoverflow.com/faq) su SO :) –

risposta

5

Dal momento che Visual Studio è un progetto closed-source, scommetto che solo gli sviluppatori sarebbero in grado di fornire una risposta definitiva su come funziona esattamente. Tuttavia, per i miei scopi è sufficiente testare alcuni scenari.

L'ho provato con una piccola soluzione e un paio di file al suo interno (un'intestazione e due file sorgente). I risultati dei test portano alla seguente conclusione. Visual Studio cerca data e ora di modifica. Anche se il contenuto del file è lo stesso, compila questo file e anche tutti gli altri file che lo includono. Se la data e l'ora della modifica sono uguali, non verrà ricompilata anche se il contenuto è diverso. Visual Studio ignora la creazione e le date e le ore di accesso.

+0

Eccellente da sapere! –

+0

Ho appena fatto alcuni dei miei test perché volevo sapere se ha mantenuto il tempo di modifica * per file * o * per build *. Sembra dal mio test che mantiene solo l'ultimo tempo di costruzione, quindi lo confronta con l'ultima volta modificata del file. Quindi ricompilerà solo se il tempo modificato del file avanza oltre l'ultima volta di costruzione. Anche se avanza ma non abbastanza, non ricompilerà. –

2

Suppongo che usi FileSystemWatcher nelle directory di progetto e nei file collegati (se presenti), solo perché è il modo giusto di fare questo genere di cose.

Alcuni googling trova per di più su questa classe (o semplicemente guardare in voi stessi):

Naturalmente, quando il file sorgente è aperto, il suo contenuto da il tempo di modifica, così come ogni utente cambia (anche non salvato) viene caricato nella RAM, ma non lo confronta con il contenuto del disco (che sarebbe troppo lento), ascolta un evento di sistema quando il sistema dice che il file è cambiato.

Aggiornamento:

Probabilmente non quella classe itslf, ma la versione Win32 di esso, si sa la maggior parte delle classi di funzionalità .NET relativi al sistema sono solo wrapper Win32.

Da questo StackOverflow risposta: How does FileSystemWatcher work on another computers directory?
Penso che avvolge questa API (non sono sicuro): http://msdn.microsoft.com/en-us/library/aa365465.aspx

Aggiornamento 2:

Questo è l'approccio di Microsoft per monitorare i cambiamenti dei file:
http://msdn.microsoft.com/en-us/library/chzww271(v=vs.80).aspx

Aggiornamento 3

Questa è una vecchia risposta, ed è stato menzionato sopra che era un'ipotesi, in quanto Visual Studio è closed source come menzionato in altre risposte. Vale la pena ricordare che la risposta accettata suggerisce Visual Studio cerca invece date di modifica dei file, il che suggerisce che non utilizza l'approccio indovinato in questa stessa risposta, e che era errato.

Spero che al lettore non sia importato lo sforzo di razionalizzare le possibilità in questa risposta (causando disagio al lettore o voti bassi). Mantenerlo solo per ragioni archivistiche.

+1

VS non è principalmente Win32, a parte i componenti dell'interfaccia utente WPF 2010? –

+0

Giusto, pensavo solo all'approccio in generale. E anche questa classe .NET è probabile (come altri) solo un wrapper Win32. Appunti applicati per pubblicare l'aggiornamento. – Meligy

+0

Questa risposta si spiega perché le domande che chiedono la speculazione non sono costruttive ... qual è il punto di * indovinare * cosa VS usa per fare questo? –

Problemi correlati