1

所以,我正在尝试创建一个 .txt 文件,然后向其中写入一些愚蠢的数据。但是我遇到了共享违规。我觉得这可能是因为我试图在创建文件后直接为文件创建 StreamWriter,但这没有意义。所以我有点失落。除了错误的行之外,我已经尝试删除班级中的所有其他 StreamWriters 和 Readers,但我仍然遇到违规行为。我得到的错误,

IOException: Sharing violation on path C:\Users\USER\Desktop\Accessible\Assets\IO\Books\A community of learners\frog\frog_status.txt
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options)
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share)
(wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)

指向线:

StreamWriter sw = new StreamWriter(statusTxtPath);

在以下函数中:

private IEnumerator GatherStatusInfo(string folderPath, string mediaName) {

        string statusTxtPath = folderPath + @"/" + mediaName + "_status.txt";
        _currentInfoBeingCreated._readingStatusTxtPath = statusTxtPath;

        if(BuildManager.instance._isResetStatusFilesWhenStarting) {
            if(File.Exists(statusTxtPath)) 
                File.Delete(statusTxtPath);
        }

        if(!File.Exists(statusTxtPath)) {
            File.Create(statusTxtPath);
            StreamWriter sw = new StreamWriter(statusTxtPath);
            sw.WriteLine(MediaStatus.Unread);
            sw.WriteLine("0");
            _currentInfoBeingCreated._status = MediaStatus.Unread;
            _currentInfoBeingCreated._pageLastRead = 0; 
            sw.Flush();
            sw.Close();

        } else {

            StreamReader statusReader = new StreamReader(statusTxtPath);
            _currentInfoBeingCreated._status = (MediaStatus) Enum.Parse(typeof(MediaStatus), statusReader.ReadLine());
            _currentInfoBeingCreated._pageLastRead = (int) ConversionUtils.instance.String2Float(statusReader.ReadLine());
            statusReader.Close();
        }

        yield return 0;
    }

知道为什么那条狗不会打猎吗?

4

5 回答 5

3

您是否有理由要创建文件然后重新打开它以写入它。StreamWriter有一个方法可以做到这一点。如果它不存在,它将创建一个新文件。

从上面的链接:

使用默认编码和缓冲区大小为指定路径上的指定文件初始化 StreamWriter 类的新实例。如果文件存在,它可以被覆盖或附加到。如果文件不存在,则此构造函数创建一个新文件。

于 2013-01-14T04:29:17.387 回答
3

StreamWriter无法访问该文件,因为File.Create返回了FileStream您没有使用的文件。

如上所述,这File.Create不是必需的。您还可以使用:

using (var writer = new StreamWriter(File.Create(statusTxtPath)))
{
   // do work here.
}

这将消耗文件流并关闭它。每当使用流和与流交互的大多数类时,请务必使用该using()块来确保正确释放句柄。

于 2013-01-14T04:34:52.160 回答
1

这可能是因为StreamWriter尚未释放非托管资源:尝试使用块using而不是手动打开和关闭它。

using (StreamWriter writer = new StreamWriter(statusTxtPath))
    {
        // do work here
    }
于 2013-01-14T04:26:25.687 回答
1

我是这种编程语言的新手,我知道一些 Ansi C 主要来自编程微控制器,但我现在正在学习 C#,我遇到了同样的问题。

System.IO.IOException
路径 /.../... 上的共享冲突

我发现拥有以下代码会引发异常。

if(!File.Exists(path))
   File.Create(path);

我发现解决这个问题的解决方案实际上使用了更少和更简单的代码。

File.AppendAllText(path, str);

使用这一行,如果文件已经存在,程序将打开文件并将文本附加到文件的末尾,如果不存在,将创建它并附加文本。

是:路径->文件的路径
            str->要写入文件的文本

我在此Xamarin 论坛页面上找到了解决方案的提示。

于 2017-04-01T17:24:46.520 回答
-1

我在多线程编程中也面临同样的问题,我认为它的线程同步问题,但问题是在 File.Create() 之后我使用了 StreamWriter。在这里,您可以尝试而不是使用两个不同的步骤,您可以在一个步骤中组合起来。这段代码对我来说很好。

using (var writer = new StreamWriter(File.Exists(path) ? File.Open(path, FileMode.Open) : File.Create(path)))
{
    writer.Write(str);
    writer.Close();
}
于 2017-12-15T17:24:03.693 回答