2012-09-12 3 views
0

최근에 C# 프로그램에서 XML 문서를 사용하는 응용 프로그램을 개발하기 시작했습니다. 모든 것이 잘 시작되었지만 코드를 편집 할 때 XML이 삭제되거나 손상된 경우를 대비해 프로그램에 조금 더 많은 기능을 추가 했으므로 프로그램이 제대로 작동하지 않게되었습니다. 데이터를 제출하고 XML로 전송할 때다른 프로세스에서 사용중인 XML 파일

다음 코드를 사용 :

: 응용 프로그램에서 "완료"를 클릭하려고하면

private void doneCreate_Click(object sender, EventArgs e) 
    { 
     //Initialize new XMLDocument class. 
     XmlDocument XmlDoc = new XmlDocument(); 

     //See if the card data file is there, if not, create it. 
     if (File.Exists(xmlPath) == false) 
     { 
      using (FileStream createFile = File.Create(xmlPath)) 
      { 
       Byte[] FileData = new UTF8Encoding(true).GetBytes(toBase64("<studycards></studycards>")); 
       // Add some information to the file. 
       createFile.Write(FileData, 0, FileData.Length); 
       createFile.Close(); 
      } 

      XMLData = "<studycards></studycards>"; 
     } 
     else 
     { 
      XMLData = readXML(); 

      if (XMLData == "") 
      { 
       XMLData = "<studycards></studycards>"; 
      } 
      else 
      { 
       XMLData = fromBase64(XMLData); 
      } 
     } 

     XmlDoc.LoadXml(XMLData); 

     XmlElement Group = XmlDoc.CreateElement("Group", null); 
     XmlAttribute Group_Attr = XmlDoc.CreateAttribute("Name"); 
     Group_Attr.Value = groupName.Text; 

     Group.Attributes.Append(Group_Attr); 

     foreach (string[] Card in CardData) 
     { 
      try 
      { 
       FrontData = Card[0].ToString(); 
       BackData = Card[1].ToString(); 

       NewCard = XmlDoc.CreateElement("Card"); 
       FrontElement = XmlDoc.CreateElement("Front"); 
       FrontElement.InnerText = FrontData; 

       BackElement = XmlDoc.CreateElement("Back"); 
       BackElement.InnerText = BackData; 

       NewCard.AppendChild(FrontElement); 
       NewCard.AppendChild(BackElement); 
       Group.AppendChild(NewCard); 
      } 

      catch 
      { 
       break; 
      } 
     } 

     XmlDoc.DocumentElement.AppendChild(Group); 

     XmlTextWriter write = new XmlTextWriter(xmlPath, null); 
     write.Formatting = Formatting.Indented; 
     XmlDoc.Save(write); 
    } 

, 나는 다음과 같은 예외되게 해요 프로세스가 다른 프로세스에서 사용 중이기 때문에 'C : \ Users \ Toshiba \ documents \ visual studio 2010 \ Projects \ StudyCards \ StudyCards \ bin \ Debug \ Resources \ card_data.xml'파일에 액세스 할 수 없습니다.

모든 솔루션?

+0

IDisposable을 구현하는 개체 주변에서 flush, close, dispose를 적절하게 사용하고 using 문을 사용해야합니다. –

+0

하나의 제안은 try/catch 블록을 제거하는 것입니다. 예외를 무시하는 것은 결코 좋은 일이 아닙니다. 또한, 당신은'new XmlTextReader()'또는'new XmlTextWriter()'를 사용하지 말아야한다. NET 2.0부터는 사용되지 않습니다. 대신'XmlReader.Create()'또는'XmlWriter.Create()'를 사용하십시오. –

답변

0

이 잘 적어도 일부 문제의 수 있습니다 :

XmlTextWriter write = new XmlTextWriter(xmlPath, null); 
write.Formatting = Formatting.Indented; 
XmlDoc.Save(write); 

당신은 결코 작가를 폐쇄하지하고, 그래서 그것을 열어 파일을 유지하는 기대. 파이널 라이저가 시작될 때까지는 파일을 열지 못하게됩니다.

또는 readXML()의 일부일 수 있습니다.이 파일은 아직 열려 있지 않은 경우 문제가 될 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 실제로 다음은 readXML()에서 가져온 것입니다. 개인 문자열되는 ReadXml() {사용 (는 StreamReader 리더 = 새로운에서는 StreamReader (xmlPath)) { 문자열 XML = reader.ReadToEnd(); reader.Close(); XML을 반환합니다. } } 그래서 끝납니다. XMLDoc을보고 문제가 어떻게 든 해결되는지 살펴 보겠습니다. 다시 연락 드리겠습니다. –

+0

"쓰기"를 참조하여 문제가 해결되지 않은 것 같습니다. 물론 도움이 될 것입니다. 상위 게시물에 포함시키지 않은 것에 대한 사과 : 여기가 오류의 출처입니다. XmlTextWriter write = new XmlTextWriter (xmlPath, null); –

+0

@JacobApixen : 다른 프로세스에서 파일을 열어 보셨습니까? 반복 할 수 있습니까? 문제를 보여주는 짧지 만 완전한 프로그램을 만들 수 있습니까? –

관련 문제