繁体   English   中英

使用StreamWriter写入Parallel.Foreach中的不同文件

[英]Using StreamWriter to write to different files in a Parallel.Foreach

我试图在Parallel.Foreach循环中编写单独的集合来分离csv。 当我运行它时,我收到以下错误:

该进程无法访问文件'C:\\ temp \\ OCRProcess \\ 2011 \\ 49 \\ OCRProcess-2011-49.csv',因为它正由另一个进程使用。

当我查看所有工作进程时,它们正在打开不同的文件,它们都没有使用相同的文件位置。 据我所知,每个线程(工作进程)都没有冲突。

public void GenerateCSVFile(List<CSVFile> csvFiles)
    {
        Parallel.ForEach(csvFiles, (csvfile, state, index) =>
            {
                var fileLocation = _storageLocation + csvfile.Type + s + csvfile.Year + s + csvfile.Day + s + csvfile.Type + "-" +
                           csvfile.Year + "-" + csvfile.Day + ".csv";

                if (!File.Exists(fileLocation))
                {
                    File.Create(fileLocation);
                }

                using (var streamWriter = new StreamWriter(fileLocation))
                {
                    foreach (var csvRecord in csvfile.CSVRecords)
                    {
                        streamWriter.WriteLine(csvRecord.Object_Id + "," + csvRecord.DocumentName + "," + csvRecord.BCI_DCN + "," + csvRecord.CreationDate);
                    }
                }                    
            });
    }

这里是CSVFile和CSVRecord类。

public sealed class CSVRecord
{
    public String BCI_DCN { get; set; }
    public String Object_Id { get; set; }
    public String DocumentName { get; set; }
    public String CreationDate { get; set; }
}



public sealed  class CSVFile
{
    public List<CSVRecord> CSVRecords { get; set; }
    public String Year { get; set; }
    public String Type { get; set; }
    public String Day { get; set; }

    public CSVFile()
    {
        CSVRecords = new List<CSVRecord>();
    }
}

问题是由File.Create(fileLocation) ,它返回一个FileStream并保持文件打开。 当StreamWriter尝试打开它时,它已经打开并导致错误。

要解决此问题,请删除以下IF语句:

if (!File.Exists(fileLocation))
{
    File.Create(fileLocation);
}

并更新了USING语句如下。 通过添加TRUE参数,它允许StreamWriter附加到文件(如果存在),否则创建它。

using (var streamWriter = new StreamWriter(fileLocation, true))
{
    foreach (var csvRecord in csvfile.CSVRecords)
    {
        streamWriter.WriteLine(csvRecord.Object_Id + "," + csvRecord.DocumentName + "," + csvRecord.BCI_DCN + "," + csvRecord.CreationDate);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM