2016-08-16 8 views
0

私のコードの目的は、xmlファイルのフォルダを監視することです。ファイルがフォルダに置かれると、それは読み込まれ、byte []に​​変換され、ソケットを介してサーバに送られ、削除されます。削除時のファイルアクセスエラー

これは、以前に送信されていないファイルがそのフォルダに置かれた場合にのみ機能します。

例:1.xmlを送信します。すべて正常に動作し、ファイルが削除されます。 1.xmlをフォルダに貼り付けます。 ファイルが読み込まれますが、削除すると例外がスローされます(別の
プロセスで使用されます)。

私が十分に長く待っていたり、代わりにファイル名を使用してもうまくいきます。 遅延を追加することができます(少なくとも3秒間動作するようにテストされています)が、プログラムの目的に反するものです。

私はPythonでこの同じコードを書いて、うまく動作するので、私は困惑しています。 下のコードを参照してください。助けてくれてありがとう!

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に行ってオープン/クローズエラーを回避しました。 コードをステップ実行するときに、ファイルが2回目に削除されるまで、例外はスローされません。 –

+0

ファイルが2度目に削除されたらどういう意味ですか?私は削除のための1つの呼び出しを参照してください。 – Broom

+0

これはループしています。送信=真と仮定する。 これは、送信がTrue(ユーザーが制御)である限り、xmlファイルの "Events_Directory"フォルダを監視します。 "1.xml"というファイルをフォルダに貼り付けると、削除を含め、すべて正常に機能します。今、そのループの中で、同じファイル "1.xml"を貼り付けると、もう一度、削除の呼び出しに達すると例外が発生します.2回目です。 私はそれをより良く説明してくれることを願っています。 –

関連する問題