2015-11-15 11 views
7

Ich habe ein VSIX-Projekt, das einige Änderungen in Project.json Datei des ASPNET5-Projekts vorgenommen wird. benutze folgendes um die .json Datei zu bearbeiten.Change VS neu laden Dateien Verhalten

ProjectJson jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); 
jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); 

var resultJson = JsonConvert.SerializeObject(jsonObj, Formatting.Indented); 

JsonSerializer serializer = new JsonSerializer(); 
using (StreamWriter sw = new StreamWriter(projectObjects.ProjectJsonPath)) 
{ 
    var writer = new JsonTextWriter(sw); 
    serializer.Serialize(writer, resultJson); 
} 

// File.WriteAllText(projectObjects.ProjectJsonPath, resultJson); 

von sowohl Strom Writer und WriteAllText ist die folgende Meldung erhält in ASPNET 5 Projekt

Die Datei hat nicht gespeicherte Änderungen in diesem Editor und hat extern geändert. willst du es neu laden?

wie zu bearbeiten. JSON-Datei ohne die obige Nachricht erhalten?

+1

Hallo Ich habe eine Möglichkeit gefunden, die Meldungsbox einzuschränken. von Visual Studio-> Extras-> Optionen> Dokumente. Ich habe das folgende Kontrollkästchen aktiviert. laden Sie geänderte Dateien neu, es sei denn, es sind nicht gespeicherte Änderungen vorhanden. Gibt es eine Möglichkeit, eine Datei nach Code neu zu laden? – user3610920

Antwort

1

Dies ist die Option, die Sie programmgesteuert überprüfen möchten. Ich weiß nicht, wie genau können Sie das tun, aber Sie können Themen zu den Einstellungen auf MSDN (Creating an option page und Creating a setting category) finden. Mit diesen Themen können Sie einen Eindruck davon bekommen, wie Optionen erstellt werden.

Grundsätzlich müssen Sie die VS-Einstellungsdatei (VS.vssettings) laden und eine weitere Xml-Zeile injizieren. (Werfen Sie einen Blick auf die Einstellungsdatei Abschnitt Untersuchen auf MSDN)

Option to deselect

aktualisieren

extrem klar zu sein, wird die VS-Einstellungsdatei

unter

befindet Dokumente \ Your_VS_Version \ Settings \ CurrentSettings.vssettings

und Sie müssen das xml laden und 'AutoloadExternalChanges' ändern, um den Wert 'true' zu erhalten. Setting section

+1

Ich kannte diesen Trick, aber ich muss dies durch Code erreichen. – user3610920

+1

Ich habe meine Frage aktualisiert. Teile deine Gedanken. Wenn Sie nicht wissen, wie man das mit Code macht, werde ich Ihnen eine Implementierung zur Verfügung stellen. –

3

Es ist eigentlich das Gegenteil. Da die Umgebung denkt, dass die Datei mit nicht gespeicherten Änderungen neu geladen werden soll.

Sie sollten die Erkennung von Dateiänderungen deaktivieren. Und wenn Sie dies tun, wird es die externen Änderungen nicht erkennen und Sie nicht warnen, aber Vorsicht, wenn Sie versuchen, die Datei nach der Änderung zu speichern, werden Sie die externe Änderung verlieren. (Kein Problem in Ihrem Fall I rate) und um die Änderungen zu sehen, müssen Sie schließen, nicht speichern die Datei und öffnen Sie es erneut.

Quelle: VS2008: Disable asking whether to reload files changed outside the IDE

Disable file change detection

1

Sie müssen die Umgebung erzählen Dateiänderungen zu ignorieren. Dies kann unter Verwendung der Schnittstellen IVsFileChangeEx und IVsDocDataFileChangeControl erreicht werden.

Hier ist eine Utility-Klasse (von dem ursprünglichen Visual Studio 2010 SDK Managed Framework-Beispielpaket abgeleitet, dass Sie noch hier finden: http://www.getcodesamples.com/src/8641B4F/98B3955E), die dazu beitragen sollte:

using (SuspendFileChanges suspend = new SuspendFileChanges(site, filePath)) 
{ 
    // do something with files 
    suspend.Sync(); // if you optionally want to tell the IDE it has changed 
} 

Die Utility-Klasse:

public class SuspendFileChanges: IDisposable 
{ 
    private readonly IServiceProvider _serviceProvider; 
    private readonly List<string> _urls; 
    private readonly IVsDocDataFileChangeControl[] _controls; 

    public SuspendFileChanges(IServiceProvider serviceProvider, string url) 
     : this(serviceProvider, new string[] { url }) 
    { 
    } 

    public SuspendFileChanges(IServiceProvider serviceProvider, params string[] urls) 
    { 
     if (serviceProvider == null) 
      throw new ArgumentNullException("serviceProvider"); 

     if (urls == null) 
      throw new ArgumentNullException("urls"); 

     _serviceProvider = serviceProvider; 
     _urls = new List<string>(urls); 
     _controls = new IVsDocDataFileChangeControl[_urls.Count]; 

     // or use Package.GetGlobalService ... 
     IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)serviceProvider.GetService(typeof(SVsRunningDocumentTable)); 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)serviceProvider.GetService(typeof(SVsFileChangeEx)); 

     for(int i = 0; i < _urls.Count; i++) 
     { 
      string url = _urls[i]; 
      if (url == null) 
       continue; 

      fileChange.IgnoreFile(0, url, 1); 

      IVsHierarchy hierarchy; 
      uint itemId; 
      uint docCookie; 
      IntPtr docData; 
      rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, url, out hierarchy, out itemId, out docData, out docCookie); 
      if (docData != IntPtr.Zero) 
      { 
       _controls[i] = Marshal.GetObjectForIUnknown(docData) as IVsDocDataFileChangeControl; 
       if (_controls[i] != null) 
       { 
        _controls[i].IgnoreFileChanges(1); 
       } 
       Marshal.Release(docData); 
      } 
     } 
    } 

    public void Sync() 
    { 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx)); 
     if (fileChange == null) 
      throw new InvalidOperationException(); 

     foreach (string url in _urls) 
     { 
      if (url == null) 
       continue; 

      fileChange.SyncFile(url); 
     } 
    } 

    public void Dispose() 
    { 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx)); 
     if (fileChange != null) 
     { 
      foreach (string url in _urls) 
      { 
       if (url == null) 
        continue; 

       fileChange.IgnoreFile(0, url, 0); 
      } 
     } 

     foreach (IVsDocDataFileChangeControl control in _controls) 
     { 
      if (control != null) 
      { 
       control.IgnoreFileChanges(0); 
      } 
     } 
    } 
}