1

我目前正在开发一个实用程序来解析多个xml文件并将结果写入csv文件。在倒数第二行(代码)我得到错误:

The process cannot access the file 'W:\SRC\hDefML\myExcelFile.csv' because it is being used by another process.'.

有人可以帮我吗,因为我不知道出了什么问题,该文件没有被其他任何东西使用,这让我发疯了吗?

这是我的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace GenNameUtility
{
    class NameGenerator
    {
        static void Main(string[] args)

        {
            var files = from file in       Directory.GetFiles("W:\\SRC\\hDefMl\\1.0\\Instrument_Files") orderby file 
        ascending select file;

        StringBuilder sb_report = new StringBuilder();

        string delimiter = ",";

        sb_report.AppendLine(string.Join(delimiter, "Module", "Generator(s)"));

        foreach (var file in files)
        {
            string filename = Path.GetFileNameWithoutExtension(file);

            Console.Write("The HDefML file for {0} contains these EEPROM Generators:", filename);

            XDocument hdefml = XDocument.Load(file);

                var GeneratorNames = from b in hdefml.Descendants("Generators") select new
        {
           name = (string)b.Element("GeneratorName") 

        }.ToString();

        StringBuilder sb = new StringBuilder();
        foreach (var item in GeneratorNames)
        {
            Console.Write("  GeneratorName is: {0}", GeneratorNames);
            sb_report.AppendLine(string.Join(delimiter, filename, GeneratorNames));

        var hdef = File.Create(@"W:\SRC\hDefML\myExcelFile.csv").ToString();
        File.WriteAllText(hdef, sb.ToString());
        }          
     }
        Console.ReadLine();
}
}

}

4

3 回答 3

5

写入文件后,您需要关闭该文件。见using

此外,最好在循环之前打开文件并在之后关闭它。

于 2013-07-01T10:01:30.980 回答
2

该文件正在被另一个进程使用......但该进程实际上是你的。

File.Create返回一个FileStream。您正在打开文件.. 写入文件.. 但没有关闭它。当新的迭代出现时..文件仍然打开。

你可以尝试这样的事情:

using (var file = File.Create(@"W:\SRC\hDefML\myExcelFile.csv")) {
    // write content here using file
} // this closes the file automatically.

正如建议的那样,我会将上述内容包装在循环之外,因此您不会经常打开和关闭文件。

于 2013-07-01T10:04:15.667 回答
0

File.WriteAllText将为您创建一个文件,因此无需File.Create事先使用。

File.WriteAllText(@"W:\SRC\hDefML\myExcelFile.csv", sb.ToString());

您的File.Create流似乎锁定了文件,这就是File.WriteAllText引发错误的原因。

如果需要使用File.Create,可以使用StreamWriter将其写出。

using(var fs = File.Create(@"W:\SRC\hDefML\myExcelFile.csv"))
using (StreamWriter sw = new StreamWriter(fs))
{
    sw.Write(sb.ToString());                  
}

作为旁注,上述using格式与做的相同

using(var fs = File.Create(@"W:\SRC\hDefML\myExcelFile.csv"))
{
   using (StreamWriter sw = new StreamWriter(fs))
   {
      sw.Write(sb.ToString());                  
   }
}

所以你可以使用任何你觉得更具可读性的东西。

于 2013-07-01T10:03:26.740 回答