ノードをリソース ファイルにアタッチしようとすると問題が発生します。私はファイルを削除することから始めます: - .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();
}
}
}
}
}
}