2013-08-05 2 views
0

현재 Itunes에서 재생되는 트랙 정보를 XML 파일에 저장하는 C# 코드가 있습니다. 코드 일부는 정상적으로 작동하지만 일반적으로 myXmlDocument.Save (ClsUtils.XmlPath)에서 "다른 프로세스에서 사용중인 프로세스이므로 xml 파일에 액세스 할 수 없습니다."오류가 발생합니다.XML 파일을 저장하는 중 오류가 발생했습니다.

중 하나가 잘못 여기에 갈 수있는 무엇을 제안 할 수 있습니다 .....

는 다음 코드

의 조각
public void ModifyLastTrack(bool bOnlyPlayerPosition) 
    { 

     //initilize XML Document 
     XmlDocument myXmlDocument = new XmlDocument(); 

     //load Xml into document 
     myXmlDocument.Load(ClsUtils.XmlPath); 

     //get Node for modify if Checked state Changed 
     XmlNode DictLastTrackNode; 
     DictLastTrackNode = myXmlDocument.DocumentElement; 

     foreach (XmlNode ChildDictNode1 in DictLastTrackNode.ChildNodes) 
     { 
      foreach (XmlNode ChildDictNode2 in ChildDictNode1.ChildNodes) 
      { 

       if (!bOnlyPlayerPosition) 
       { 

        if (ChildDictNode2.Name == "TrackID") 
         ChildDictNode2.InnerText = TrackID; 
             } 
       else 
       { 
        if (ChildDictNode2.Name == "PlayerPosition") 
         ChildDictNode2.InnerText = PlayerPosition.ToString(); 
       } 
      } 

     } 


     //save Xml after modification 
     myXmlDocument.Save(ClsUtils.XmlPath); 

    } 
+1

는 분명히 다른 프로세스가 열려있는 파일을 유지하고 파일을 점유하는 다른 프로세스의 경우에는 저장하려는 XML로 –

+0

이 오류 번호를 추가하는 것입니다 내용을 저장 한 후에 myXmlDocument'를'Disposing'하는 곳에서 원래의 XMLDocument를'Disposed '하지 않을 때 발생합니다 ..? 'myXmlDocument.Save (ClsUtils.XmlPath)'다음에'using() {}'에 XmlDocument 객체의 생성을 래핑하거나 덮어 쓰는 것이 좋습니다. 다음 ('IDisposable myXmlDocument) .Dispose();' – MethodMan

+0

@ DJKRAZE - 총 꼴통. XmlDocuemnt는 IDispsable이 아닙니다. 게다가'Save()'와'Load()'는 아무 것도 닫히지 않은 상태로 남겨 두지 않는다. –

답변

1

당신은에 따라이 문제를 일으키는 프로세스를 종료 할 수있다 코드,하지만 그건 제안 아니에요 좋은 생각 :

string fileName = @"D:\pathname.jpg";//Path to locked file 

Process Handletool = new Process(); 
Handletool.StartInfo.FileName = "handle.exe"; 
Handletool.StartInfo.Arguments = fileName+" /accepteula"; 
Handletool.StartInfo.UseShellExecute = false; 
Handletool.StartInfo.RedirectStandardOutput = true; 
Handletool.Start();   
Handletool.WaitForExit(); 
string outputTool = Handletool.StandardOutput.ReadToEnd(); 

string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)"; 
foreach(Match match in Regex.Matches(outputTool, matchPattern)) 
{ 
    Process.GetProcessById(int.Parse(match.Value)).Kill(); 
} 

당신은 here

012에서 Handle.exe를 얻을 수 있습니다

문제는 누군가 파일을 열었습니다. 아마도 당신이나 당신이 작성한 프로그램 일 것입니다. 스트림을 열거 나 using 문을 사용할 때마다 닫아야합니다. 또 다른 방법, 즉 더 좋을 수도, 일반적으로 .... 당신이

+0

OP가 iTunes를 모니터링하고 있습니다. 당신의 솔루션으로 인해 iTunes가 죽을 수도 있습니다. 또는 또 다른 필수 프로세스. –

+0

@HenkHolterman 그게 내가 제안한 것이 아니라고 말한 이유입니다.하지만 해결책은 물론 내가 쓴 것 –

관련 문제