2016-08-16 4 views
0

여기 내 코드의 목적은 xml 파일의 폴더를 모니터링하는 것입니다. 파일이 폴더에 저장되면, 읽히고 byte []로 변환되며, 소켓을 통해 서버로 보내지고 삭제됩니다.삭제시 파일 액세스 오류

이전에 보내지 않은 파일이 폴더에있는 경우에만 작동합니다.

예 : 1.xml을 보내면 모든 것이 잘 작동하고 파일이 삭제됩니다. 1.xml을 폴더에 붙여 넣습니다. 파일이 읽히지 만 삭제할 때 다른
프로세스에서 사용하는 예외가 발생합니다.

길거나 다른 파일 이름을 기다리는 경우 정상적으로 작동합니다. 지연 (3 초 이상 작동 함)을 추가 할 수는 있지만 프로그램의 목적에 어긋납니다.

파이썬에서이 동일한 코드를 작성 했으므로 잘 작동하므로 문제가 발생합니다. 아래 코드를 참조하십시오. 어떤 도움을 주셔서 감사합니다!

string[] files; 
while (sending) 
{ 
    files = Directory.GetFiles(Events_Directory, "*.xml");      
    foreach(string file in files) 
    { 
     Message = System.Text.UTF8Encoding.ASCII.GetBytes(Regex.Replace(
          File.ReadAllText(file), @"[\r\n\t ]+", "")); 
     Thread.Sleep(500); 
     Sock.Send(Message); 
     File.Delete(file); 
    } 
} 

답변

0

그래, 예외가 발생한 곳이 잘못되었습니다. 실제로 제 2의 파일을 읽으려고 한 후였습니다. 이 코드가 실행중인 스레드가 종료되고 "다시 시작되면 모든 것이 정상적으로 진행됩니다. 그래서 스레드의 메서드가 아닌 루프 자체에 넣을 수있는 해결 방법을 추가했습니다.

 while (sending) 
    { 
       Thread EventSenderThread = new Thread(() => 
        Communications.EventSender(Event_Directory)); 
       EventSenderThread.Start(); 
       while (EventSenderThread.IsAlive) 
       { System.Windows.Forms.Application.DoEvents(); } 
    } 
0

StreamReader를 사용해보고 스트림을 명시 적으로 닫을 수 있습니다.

string[] files; 
while (sending) 
{ 
    files = Directory.GetFiles(Events_Directory, "*.xml"); 
    foreach (string file in files) 
    { 
     StreamReader IN = new StreamReader(file); 
     string allText = IN.ReadToEnd(); 
     IN.Close(); 
     Message = System.Text.UTF8Encoding.ASCII.GetBytes(Regex.Replace(
          allText, @"[\r\n\t ]+", "")); 
     Sock.Send(Message); 
     File.Delete(file); 
    } 
} 
+0

나는 그것을 시도했다. 사실, 처음에는 StreamReader를 사용했지만 열기/닫기 오류를 피하기 위해 File.ReadAllText로갔습니다. 코드를 단계별로 실행할 때 파일이 두 번째로 삭제 될 때까지 예외가 throw되지 않습니다. –

+0

파일을 두 번째로 삭제한다는 것은 무엇을 의미합니까? 삭제 요청은 1 건입니다. – Broom

+0

반복됩니다. 보내는 = True라고 가정합니다. 그래서 보내기가 True (사용자가 제어) 인 동안 xml 파일의 해당 폴더 "Events_Directory"를 모니터링합니다. "1.xml"파일을 폴더에 붙여 넣으면 삭제를 포함하여 모든 작업이 올바르게 수행됩니다. 자, 여전히 그 루프에있는 동안 동일한 파일 "1.xml"을 붙이면 삭제 요청에 도달하면 예외가 발생합니다 (두 번째). 더 나은 설명이 되었기를 바랍니다. –

관련 문제