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

本文关键字:文件 进程 另一个 代码 告诉我 异常 一个 | 更新日期: 2023-09-27 18:00:57

在我为异常处理而编写的代码中,您输入了两个数字。如果发生异常,它会将其写入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中的fileStream在代码中仍然没有关闭。因此,您会得到错误。

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);                
              }
            }
        }

如果你在某个地方打开了文件来查看详细信息,而你的程序试图向它写入,你会遇到异常,因为它无法锁定它。我在windows 7上观察到了类似的行为,你关闭了文件,但不知怎的操作系统仍然锁定了它,你的程序需要几秒钟才能锁定它。我建议的一件事是在你的蒸汽写入器上使用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();
                     }
                    }

File.Create方法已经为您提供了一个文件流,您正在尝试创建一个新的文件流。您应该使用file.Create方法返回的文件流。

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