C# 进程无法访问该文件,因为其他进程正在使用该文件

C# 进程无法访问该文件,因为其他进程正在使用该文件,c#,.net-core,C#,.net Core,我已经创建了一个服务工作者,它读取串行端口信息并创建一个.csv文件来保存结果 但是,当我尝试写入文件时,它会说进程无法访问该文件,尽管(据我所知)该文件未打开、被另一个外部进程使用或文件流正在打开(我使用的是System.IO.file.WriteAllines())。有什么问题吗 static string InsturmentFile = $"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData

我已经创建了一个服务工作者,它读取串行端口信息并创建一个.csv文件来保存结果

但是,当我尝试写入文件时,它会说进程无法访问该文件,尽管(据我所知)该文件未打开、被另一个外部进程使用或文件流正在打开(我使用的是System.IO.file.WriteAllines())。有什么问题吗

static string InsturmentFile = $"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}\\TestLogger\\";

public static void StartConnector()
    {
        Directory.CreateDirectory(InsturmentFile);
    }


public static string FullFilePath(this string fileName)
    {
        return $"{InsturmentFile}\\{fileName}";
    }


public static List<string> LoadFile(this string file)
    {
        if (!System.IO.File.Exists(file))
        {
            return new List<string>();
        }

        return System.IO.File.ReadAllLines(file).ToList();
    }

    public static List<InstrumentRawReading> ConvertToInstrumentRawReadingModel(this List<string> lines)
    {
        List<InstrumentRawReading> output = new List<InstrumentRawReading>();


        foreach (string line in lines)
        {
            string[] cols = line.Split(',');
            InstrumentRawReading u = new InstrumentRawReading();
            string spacer = " "; 
            var now = DateTime.Now;
            now = DateTime.Parse(cols[0]);
            foreach (var reading in u.Readings)
            {                                   
                reading.Name = cols[1];
            }
            output.Add(u);
        }


        return output;
    }

public static void SaveReadingsLogToFile(this List<InstrumentRawReading> models, string fileName)
    {
        try
        {
            List<string> lines = new List<string>();

            foreach (InstrumentRawReading u in models)
            {
                foreach (var rd in u.Readings)
                {
                    lines.Add($"{rd.Time},{u.SerNo},{rd.Name},{rd.Rdg},{rd.Units}");
                }

            }
            System.IO.File.WriteAllLines(fileName.FullFilePath(), lines);

        }
        catch (Exception ex)
        {
            Console.WriteLine("SaveReadingsLogToFile: " + ex.Message.ToString());
            throw;
        }

    }
static string instrumentfile=$“{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}\\TestLogger\\”;
公共静态无效StartConnector()
{
Directory.CreateDirectory(instrumentfile);
}
公共静态字符串FullFilePath(此字符串文件名)
{
返回$“{instrumentfile}\\{fileName}”;
}
公共静态列表加载文件(此字符串文件)
{
如果(!System.IO.File.Exists(File))
{
返回新列表();
}
return System.IO.File.ReadAllLines(File.ToList();
}
公共静态列表转换为INSTRUMENTRANGMODEL(此列表行)
{
列表输出=新列表();
foreach(行中的字符串行)
{
string[]cols=line.Split(',');
InstrumentRawReading u=新的InstrumentRawReading();
字符串间隔符=”;
var now=DateTime.now;
now=DateTime.Parse(cols[0]);
foreach(美国读数中的var读数)
{                                   
reading.Name=cols[1];
}
输出。添加(u);
}
返回输出;
}
公共静态void SaveReadingsLogToFile(此列表模型,字符串文件名)
{
尝试
{
列表行=新列表();
foreach(在模型中读取u)
{
foreach(美国读数中的var rd)
{
添加($“{rd.Time},{u.SerNo},{rd.Name},{rd.Rdg},{rd.Units}”);
}
}
System.IO.File.writeAllines(fileName.FullFilePath(),行);
}
捕获(例外情况除外)
{
Console.WriteLine(“SaveReadingsLogToFile:+ex.Message.ToString());
投掷;
}
}

这是完整的文件创建类,我正在使用创建.csv文件,它正在创建并填充一个读数,但是,在方法的后续调用中,它似乎停止工作。

如果错误是
进程无法访问该文件,因为它正被另一个进程使用
,那么无论您说什么,它都将被另一个进程使用

你可以使用微软的一个不错的工具,你可以搜索你的文件,它会告诉你哪个进程锁定了你的文件


单击
查找
/
查找句柄或DLL..
,只需键入文件名

,因此我的方法的一个问题是,串行端口信息在多个位置被快速读取,以至于调用几乎同时进行。一个快速修复(hack)方法是在调用之前或之后添加一点延迟,这似乎可以完成任务,但是更简单的修复方法是限制从串行端口调用函数的次数,因为这样可以确保文件始终打开以供使用,如SaveReadingLogToFile()没有从不同的线程/位置多次调用。我认为最好的解决方法是将操作写入队列和/或在写入文件时添加锁

这里的一些建议表明,这可能是一个反病毒程序。原始作者发现代码中的其他地方有一个文件是通过StreamReader或类似程序打开的,并且没有正确处理。您是否异步执行这些代码?我相信
writeAllines
会在写入期间锁定文件进行读写。完整和实际的错误消息是什么?它可能不是实际使用该文件的另一个进程,它可能只是阻止访问的ACL。检查要写入文件的文件夹上的ACL。由于我已经创建了一个服务工作者来执行此操作,所以我使用-async Task ExecuteAsync(CancellationToken),在我有一个switch语句的最高级别,这将调用一个创建读取的方法。整个调用链中唯一的异步方法是初始ExecuteAsync方法。这可能是原因吗?SaveReadingLogToFile:进程无法访问文件“C:\ProgramData\TestLogger\InstrumentRawReadingLog.csv”,因为另一个进程正在使用该文件。是完整错误当您自己的进程锁定了文件时,您也可以收到相同的消息,因此错误消息可能会误导您知道哪个进程锁定了文件。它可以是当前正在运行的进程。我已经使用Process Explorer尝试并确定它是否被使用无效。@Martin是的,但在这种情况下,它将是另一个threadId,试图访问由同一进程的另一个threadId使用的文件。不会改变这也会显示在Process Explorer中。@Sskaara如果找不到它,则表示在执行搜索时句柄已关闭。这意味着你确实有一把锁,但它不会持续很长时间。啊,我明白了,这是有道理的。你建议我如何着手找出到底是什么导致了这个问题?