当我尝试将节点附加到资源文件时遇到问题。我首先删除文件: - .resx 并创建一个新文件: - File.Create( .resx).Close();
我有一个迭代方法应该在该文件中写入一个节点,但结果是一个仅包含最后一个节点的资源文件。我在这个论坛上搜索了一个解决方案,发现解决方案必须是我读入文件中的元素/节点(从一开始就为空),然后再次写入它们,最后是我的新节点。然后我做这个迭代。它根本没有效率,但因为在这种情况下它并不重要,我可以忍受。但是,我遇到了文件已经在其他进程中打开的问题。我做了一些更改,现在我遇到了一个问题,我无法添加已添加的节点。需要一些帮助。这是我的代码:
private void WriteToResxFile(List<CompleteString> listStrings)
{
ResXResourceWriter writer;
ResXResourceReader reader;
IDictionaryEnumerator readerNode;
ResXDataNode node;
FileInfo fileInfo;
Hashtable resourceEntries;
System.ComponentModel.Design.ITypeResolutionService typeres;
string text;
RemoveExistingResxFiles();
foreach (Language lang in languages)
{
foreach (ResourceFile file in resourcefilesPaths)
{
fileInfo = new FileInfo(file.mPath);
fileInfo.IsReadOnly = false;
reader = new ResXResourceReader(file.mPath);
reader.UseResXDataNodes = true;
fileInfo.IsReadOnly = false;
typeres = null;
foreach (CompleteString completeString in listStrings)
{
if (completeString.mFileName.Equals(file.mResxName))
{
int index = file.mPath.IndexOf(".");
if (lang.mResx.Equals(file.mPath.Substring(index)))
{
writer = new ResXResourceWriter(file.mPath);
if (reader != null && fileInfo.Length != 0)
{
foreach (DictionaryEntry d in reader)
{
//Read from file:
resourceEntries = new Hashtable();
string val = "";
if (d.Value == null)
resourceEntries.Add(d.Key.ToString(), "");
else
{
val = ((ResXDataNode)d.Value).GetValue(typeres).ToString();
resourceEntries.Add(d.Key.ToString(), val);
}
//Write (with read to keep xml file order)
ResXDataNode dataNode = (ResXDataNode)d.Value;
writer.AddResource(dataNode);
}
reader.Close();
}
text = CorrectStringDependedOnLangauge(completeString, lang);
node = new ResXDataNode(completeString.mStringName, text);
node.Comment = completeString.mStringType;
fileInfo.IsReadOnly = false;
writer.AddResource(node);
writer.Close();
}
}
}
}
}
解决方案:
foreach (Language lang in languages)
{
foreach (ResourceFile file in resourcefilesPaths)
{
fileInfo = new FileInfo(file.mPath);
fileInfo.IsReadOnly = false;
fileInfo.IsReadOnly = false;
typeres = null;
foreach (CompleteString completeString in listStrings)
{
if (completeString.mFileName.Equals(file.mResxName))
{
int index = file.mPath.IndexOf(".");
if (lang.mResx.Equals(file.mPath.Substring(index)))
{
reader = new ResXResourceReader(file.mPath);
reader.UseResXDataNodes = true;
writer = new ResXResourceWriter(file.mPath);
if (reader != null && fileInfo.Length != 0)
{
foreach (DictionaryEntry d in reader)
{
resourceEntries = new Hashtable();
string val = "";
if (d.Value == null)
resourceEntries.Add(d.Key.ToString(), "");
else
{
val = ((ResXDataNode)d.Value).GetValue(typeres).ToString();
resourceEntries.Add(d.Key.ToString(), val);
}
ResXDataNode dataNode = (ResXDataNode)d.Value;
writer.AddResource(dataNode);
}
}
reader.Close();
text = CorrectStringDependedOnLangauge(completeString, lang);
node = new ResXDataNode(completeString.mStringName, text);
node.Comment = completeString.mStringType;
fileInfo.IsReadOnly = false;
writer.AddResource(node);
writer.Close();
}
}
}
}
}
}