我的代码的目的是监视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 :(得分: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);
}
}
答案 1 :(得分:0)
好的,所以我错误地发生了异常。它实际上是在试图读取文件后第二次转过来。 我注意到如果运行此代码的线程已经终止并且#34;重新启动,那么一切都很顺利。所以我添加了一个解决方法,将线程本身放在一个循环中,而不是线程的方法。
while (sending)
{
Thread EventSenderThread = new Thread(() =>
Communications.EventSender(Event_Directory));
EventSenderThread.Start();
while (EventSenderThread.IsAlive)
{ System.Windows.Forms.Application.DoEvents(); }
}