删除文件时访问错误

本文关键字:错误 访问 文件 删除 | 更新日期: 2023-09-27 18:02:35

这里的代码的目的是监视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);
    }
}

删除文件时访问错误

您可以尝试使用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);
    }
}

好的,所以我错了异常发生的地方。它实际上是在试图读取文件后的第二次去。我注意到,如果这个代码正在运行的线程被终止并"重新"启动,一切都很好。因此,我添加了一个变通方法,将线程本身置于循环中,而不是线程的方法。

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