2015-11-15 41 views
7

Mam jeden projekt VSIX, który dokona pewnych zmian w pliku Project.json projektu ASPNET5. używam następujących plików do edycji pliku .json.Zmiana zachowania plików ponownego ładowania VS

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); 

za pomocą strumienia zarówno pisarz i writealltext otrzymuję następujący komunikat w ASPNET 5 projektu

plik niezapisane zmiany wewnątrz tego edytora i został zmieniony zewnętrznie. czy chcesz go ponownie załadować?

Jak edytować plik .json bez uzyskania powyższej wiadomości?

+1

Witam Znalazłem jeden sposób ograniczenia zakresu wiadomości. z Visual Studio-> Narzędzia-> opcje> Dokumenty. Mam zaznaczone następujące pole wyboru. ponownie załaduj zmodyfikowane pliki, chyba że są niezapisane zmiany. Czy istnieje sposób na ponowne załadowanie pliku według kodu? – user3610920

Odpowiedz

1

Jest to opcja, którą chcesz sprawdzić programowo. Nie wiem, jak to zrobić, ale można znaleźć tematy dotyczące ustawień w MSDN (Creating an option page i Creating a setting category). Korzystając z tych tematów, możesz mieć poczucie, w jaki sposób tworzone są opcje.

Zasadniczo wystarczy załadować plik ustawień VS (VS.vssettings) i wstrzyknąć kolejną linię Xml. (Wystarczy popatrzeć na Badając sekcji Ustawienia plików na MSDN)

Option to deselect

Aktualizacja

być bardzo jasne plik ustawień VS znajduje się pod

Dokumenty \ Twoja_VS_wersja \ Ustawienia \ CurrentSettings.vssettings

i trzeba załadować XML i zmiana „AutoloadExternalChanges” wartości „prawdziwej”. Setting section

+1

Znałem tę sztuczkę, ale muszę to osiągnąć za pomocą kodu. – user3610920

+1

Mam zaktualizowane moje pytanie. Podziel się swoimi przemyśleniami. Jeśli nie wiesz, jak to zrobić za pomocą kodu, dostarczę ci implementację. –

3

Jest to wręcz przeciwnie. Ponieważ środowisko uważa, że ​​plik ma zostać przeładowany niezapisanymi zmianami.

Powinieneś odznaczyć wykrywanie zmian w plikach. A kiedy to zrobisz, nie wykryje zewnętrznych zmian i nie ostrzeże cię, strzeż się jednak, że jeśli spróbujesz zapisać plik po jego modyfikacji, stracisz zewnętrzną zmianę (nie jest to problemem w twoim przypadku) zgadnij) i aby zobaczyć zmiany, które będziesz musiał zamknąć, nie zapisuj pliku i nie otwieraj go ponownie.

Źródło: VS2008: Disable asking whether to reload files changed outside the IDE

Disable file change detection

1

Trzeba powiedzieć środowiska ignorować zmian w plikach. Można to osiągnąć za pomocą interfejsów IVsFileChangeEx i .

Oto klasy narzędzie (pochodzące z oryginalnego Visual Studio 2010 SDK Zarządzane Framework Pakiet próbek, które wciąż można znaleźć tutaj: http://www.getcodesamples.com/src/8641B4F/98B3955E), które powinny pomóc:

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

Klasa użyteczności:

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); 
      } 
     } 
    } 
}