2013-09-05 14 views
5

Korzystam z następującego kodu do programowego generowania pliku zasobów.Modyfikowanie pliku istniejącego zasobu programowo

ResXResourceWriter resxWtr = new ResXResourceWriter(@"C:\CarResources.resx"); 
resxWtr.AddResource("Title", "Classic American Cars"); 
resxWtr.Generate(); 
resxWtr.Close(); 

Teraz chcę zmodyfikować plik zasobowy utworzony z powyższego kodu. Jeśli użyję tego samego kodu, istniejący plik zasobów zostanie wymieniony. Pomóż mi go zmodyfikować bez utraty istniejącej zawartości.

Pozdrawiam, Ankit

Odpowiedz

0

Oto funkcja, która pomoże Ci zmodyfikować plik zasobów.

public static void UpdateResourceFile(Hashtable data, String path) 
{ 
    Hashtable resourceEntries = new Hashtable(); 

    //Get existing resources 
    ResXResourceReader reader = new ResXResourceReader(path); 
    if (reader != null) 
    { 
     IDictionaryEnumerator id = reader.GetEnumerator(); 
     foreach (DictionaryEntry d in reader) 
     { 
      if (d.Value == null) 
       resourceEntries.Add(d.Key.ToString(), ""); 
      else 
       resourceEntries.Add(d.Key.ToString(), d.Value.ToString()); 
     } 
     reader.Close(); 
    } 

    //Modify resources here... 
    foreach (String key in data.Keys) 
    { 
     if (!resourceEntries.ContainsKey(key)) 
     { 

      String value = data[key].ToString(); 
      if (value == null) value = ""; 

      resourceEntries.Add(key, value); 
     } 
    } 

    //Write the combined resource file 
     ResXResourceWriter resourceWriter = new ResXResourceWriter(path); 

     foreach (String key in resourceEntries.Keys) 
     { 
      resourceWriter.AddResource(key, resourceEntries[key]); 
     } 
     resourceWriter.Generate(); 
     resourceWriter.Close(); 

} 

Link referencyjny here

+1

nie chcę aby ponownie zapisać istniejący plik zasobów, chcę tylko dodać do niego nowe zasoby. Czy jest jakiś inny sposób? –

2
public static void AddOrUpdateResource(string key, string value) 
    { 
     var resx = new List<DictionaryEntry>(); 
     using (var reader = new ResXResourceReader(resourceFilepath)) 
     { 
      resx = reader.Cast<DictionaryEntry>().ToList(); 
      var existingResource = resx.Where(r => r.Key.ToString() == key).FirstOrDefault(); 
      if (existingResource.Key == null && existingResource.Value == null) // NEW! 
      { 
       resx.Add(new DictionaryEntry() { Key = key, Value = value }); 
      } 
      else // MODIFIED RESOURCE! 
      { 
       var modifiedResx = new DictionaryEntry() { Key = existingResource.Key, Value = value }; 
       resx.Remove(existingResource); // REMOVING RESOURCE! 
       resx.Add(modifiedResx); // AND THEN ADDING RESOURCE! 
      } 
     } 
     using (var writer = new ResXResourceWriter(ResxPathEn)) 
     { 
      resx.ForEach(r => 
      { 
       // Again Adding all resource to generate with final items 
       writer.AddResource(r.Key.ToString(), r.Value.ToString()); 
      }); 
      writer.Generate(); 
     } 
    } 
0

miałem ten sam problem ten rozwiązać go:

ta dołączy do istniejącego pliku .resx

var reader = new ResXResourceReader(@"C:\CarResources.resx");//same fileName 
var node = reader.GetEnumerator(); 
var writer = new ResXResourceWriter(@"C:\CarResources.resx");//same fileName(not new) 
while (node.MoveNext()) 
     { 
    writer.AddResource(node.Key.ToString(), node.Value.ToString()); 
     } 
    var newNode = new ResXDataNode("Title", "Classic American Cars"); 
    writer.AddResource(newNode); 
    writer.Generate(); 
    writer.Close(); 
+0

Możesz czytać i pisać do tego samego pliku w tym samym czasie? –

Powiązane problemy