当前位置: 首页 > 知识库问答 >
问题:

C#system.io IOException“文件无法访问,因为它被另一个进程访问”[重复]

程旭尧
2023-03-14

我刚使用System.io,我不明白为什么我的代码会导致这个异常。我想检查一个目录和一个文件是否存在,如果不存在,我想创建它们。之后,我想在我刚创建的文件上写点东西。在这里它抛出异常。我非常确信,当im试图使用StreamWriter时,创建会导致异常,因为如果该文件已经存在,我不会得到一个执行。此外,当我在一次尝试失败后再次单击调用此funktion的按钮时,没有任何例外,并且一切都运行良好(看起来我的程序在刷新UI后意识到没有打开的进程)。我不明白,似乎还有什么其他进程在访问该文件,我认为在使用fileinfo.create()funktion之后,我不需要关闭任何流。

public static void Save_map(int[,] p_temp_map_property, string p_filename)
    {
        temp_map_property = p_temp_map_property;
        try
        {
            DirectoryInfo MapsDirectory = new DirectoryInfo("Maps");
            DirectoryInfo Map = new DirectoryInfo(@"Maps\" + p_filename);
            FileInfo file = new FileInfo(@"Maps\" + p_filename + @"\" + p_filename + ".txt");
            if (!MapsDirectory.Exists)
            {
                MapsDirectory.Create();
            }

            if (!Map.Exists)
            {
                Map.Create();
            }

            if (!file.Exists)
            {
                file.Create();
            }

            StreamWriter sw = new StreamWriter(@"Maps\" + p_filename + @"\" + p_filename + ".txt", false);
            
            for(int n = 0; n < 140; n++)
            {
                for(int m = 0; m < 90; m++)
                {
                    sw.WriteLine(p_temp_map_property[n, m]);
                }
            }
            sw.Close();
            sw.Dispose();
            MessageBox.Show("Map saved successfully!");
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }
Exception thrown: "System.IO.IOException" in mscorlib.dll
System.IO.IOException: The procces cannot acsses "C:\Users\User\source\repos\Map Editor TD\Map Editor TD\bin\Debug\Maps\test\test.txt" because it is accsessed in another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
   at System.IO.StreamWriter..ctor(String path, Boolean append)
   at Map_Editor_TD.Save_to_File.Save_map(Int32[,] p_temp_map_property, String p_filename) in C:\Users\User\source\repos\Map Editor TD\Map Editor TD\Save_to_File.cs:Zeile 39.

我希望有比我更有经验的人能帮我。提前道谢。

共有1个答案

狄卓君
2023-03-14

file.create();使文件保持打开状态,并返回句柄。要么先关闭它,要么用它向它写东西。

下面的代码使用它:

public static void Save_map(int[,] p_temp_map_property, string p_filename)
{
    temp_map_property = p_temp_map_property;
    try
    {
        DirectoryInfo MapsDirectory = new DirectoryInfo("Maps");
        DirectoryInfo Map = new DirectoryInfo(@"Maps\" + p_filename);
        FileInfo file = new FileInfo(@"Maps\" + p_filename + @"\" + p_filename + ".txt");
        if (!MapsDirectory.Exists)
        {
            MapsDirectory.Create();
        }

        if (!Map.Exists)
        {
            Map.Create();
        }

        using (FileStream fileStream = file.Exists ? file.OpenWrite() : file.Create())
        using (StreamWriter sw = new StreamWriter(fileStream, false))
        {
            for (int n = 0; n < 140; n++)
            {
                for (int m = 0; m < 90; m++)
                {
                    sw.WriteLine(p_temp_map_property[n, m]);
                }
            }
        }
        
        MessageBox.Show("Map saved successfully!");
    }
    catch(Exception e)
    {
        MessageBox.Show(e.ToString());
    }
}
 类似资料:
  • 我的脚本搜索特定目录中的所有pdf文件,然后从pdf中提取一个id,并在文件中组织pdf。例如我有: 我想这样组织它们: 下面的脚本做的工作,但我认为只有最后一个文件输出以下错误: 回溯(最近一次调用):文件“C:\Users\user\Downloads\aa\project.py”,第74行,在操作系统中。rename(source,dest)PermissionError:[WinError

  • 我是C#新手,连接Firebird数据库时遇到问题。我想让我的程序访问Firebird数据库[FDB格式文件]。我有问题,请参见下面的代码: 这段代码允许我读取FDB文件并提取数据。当代码第一次执行时,没有错误或问题,但是当我再次执行时,这个错误会显示出来: 进程无法访问文件“C:\Users\ACC-0001”。FDB’因为它正被另一个进程使用。

  • 下面是使用Ucanaccess Jdbc驱动程序从Microsoft Access文件filename.accdb获取连接的代码。但在运行此代码时,它会抛出异常,就像已经使用的文件一样。 但是我想在其他应用程序使用MSAccess数据库文件时并发地使用它。 当我运行上面的代码时,出现了如下异常: net.ucanaccess.jdbc.ucanaccesssqlexception:UCAEXC::

  • 问题内容: 我的代码用于一个脚本,该脚本查看一个文件夹并删除分辨率为1920x1080的图像。我的问题是我的代码运行时; 我收到此错误消息: 只需确认一下,Python是我计算机上运行的唯一程序。是什么导致此问题,我该如何解决? 问题答案: 您的过程就是打开文件的过程(仍然存在)。您需要先关闭它,然后再删除它。 我不知道PIL是否支持上下文,但是是否支持: 进入之前,请确保删除(并关闭文件)。 如

  • 我是编程新手,我有一个问题。如果我有两个函数,一个创建一个文本文件并写入其中,而另一个打开同一个文本文件并从中读取。 我得到的错误是: 系统伊奥。IOException:'进程无法访问文件'@。txt“因为它正被另一个进程使用。” 我曾尝试为每个功能设置单独的计时器,但仍然不起作用。我认为最好的办法是函数二直到函数一结束才开始。 你能帮我实现这个吗?非常感谢!迈克 源代码:

  • 我试图遍历目录中的所有文件,并为每个文件名添加一个值。使用文件。move会创建一个FileSystemException,并声明该文件正被另一个进程使用。使用注释掉的文件。移动(文件[i].toPath…)删除创建新文件,从目录中删除旧文件,但不会替换原始文件。任何帮助都将不胜感激。对于下面的错误,我有一个东西。txt文件保存在文档中,我想在文件名后面加上“e”。 C:\用户\Bob\文档- 在爪