C# 接收到一个异常,告诉我代码中使用的文件正被另一个进程使用?

C# 接收到一个异常,告诉我代码中使用的文件正被另一个进程使用?,c#,exception,C#,Exception,在我编写的代码中,作为异常处理的实践,您输入了两个数字。如果发生异常,它会将其写入log.txt;如果发生内部异常(如该文件不存在),它会创建日志文件,然后写入。代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace ConsoleApplication21

在我编写的代码中,作为异常处理的实践,您输入了两个数字。如果发生异常,它会将其写入log.txt;如果发生内部异常(如该文件不存在),它会创建日志文件,然后写入。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication21
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                try
                {
                    Console.WriteLine("Please enter your numerator!");
                    int numerator = Convert.ToInt32(Console.ReadLine());

                    Console.WriteLine("Please enter your denominator!");
                    int denominator = Convert.ToInt32(Console.ReadLine());

                    int Result = numerator / denominator;
                    Console.WriteLine("The result of the division of the two numbers {0} and {1} is: {2}", numerator, denominator, Result);
                }
                catch (FormatException formex)
                {
                    Console.WriteLine("Error format exception detected!");
                }

                catch (Exception ex)
                {

                    if (File.Exists(@"C:\test files\log.txt"))
                    {
                        string dump = @"C:\test files\log.txt";
                        StreamWriter Streamwriter = new StreamWriter(dump);
                        Console.WriteLine("An unknown exception was detected and an error log has been dumped at {0}!", dump);
                        Streamwriter.WriteLine(ex.Message);
                        Streamwriter.WriteLine(ex.StackTrace);
                        Streamwriter.Close();
                    }

                    else
                    {
                        throw new FileNotFoundException("Error file was not found!!!");

                    }
                }
            }

            catch(FileNotFoundException filex)
            {
                Console.WriteLine("Error: log file not found! Creating file!");
                File.Create(@"C:\test files\log.txt");
                    StreamWriter StreamWriter = new StreamWriter(@"C:\test files\log.txt");
                    StreamWriter.WriteLine(filex.GetType().Name);
                    StreamWriter.WriteLine(filex.InnerException.GetType().Name);
                    StreamWriter.Close();


            }
        }
    }
}

但是,当我运行代码并通过删除txt并强制程序创建一个新文件来测试文件创建系统时,我得到一个异常,告诉我“进程无法访问该文件,因为它正被另一个进程使用”此外,由于此异常,错误不会写入log.txt,它只会生成一个空白文本文件。据我观察,这背后的原因是代码末尾的Streamwriter类导致了错误。出于某种原因,即使在创建文件后仍运行File.Create行时,由于某种原因,该行仍保留该文件,因此不允许StreamWriter打开并写入该文件。如何修复此问题?

按如下方式修改代码,File.Create中的文件流在代码中仍然没有关闭。因此,您得到了错误

catch (FileNotFoundException filex) {
            Console.WriteLine("Error: log file not found! Creating file!");
            using (var fileStream = File.Create(@"C:\test files\log.txt")) {
                using (var streamWriter = new StreamWriter(fileStream)) {
                  streamWriter.WriteLine(filex.GetType().Name);
                  streamWriter.WriteLine(filex.InnerException.GetType().Name);                
              }
            }

        }

如果您在某处打开了文件以查看详细信息,并且您的程序试图写入该文件,您将得到该异常,因为它无法锁定该文件。我在Windows7上也观察到类似的行为,你关闭了文件,但不知何故操作系统仍然锁定了它,你的程序需要几秒钟才能锁定它。我建议的一件事是在steam编写器上使用block,它会在最后自动刷新缓冲区

 if (File.Exists(@"C:\test files\log.txt"))
                    {
                        string dump = @"C:\test files\log.txt";
                        using(StreamWriter Streamwriter = new StreamWriter(dump))
                        {
                        Console.WriteLine("An unknown exception was detected and an error log has been dumped at {0}!", dump);
                        Streamwriter.WriteLine(ex.Message);
                        Streamwriter.WriteLine(ex.StackTrace);
                        Streamwriter.Close();
                     }
                    }
Create方法已经为您提供了一个文件流,您正在尝试创建一个新的文件流。您应该使用file.Create方法返回的文件流

using (FileStream fs = File.Create(path))
{
    //you can use the filstream here to write to file
}