Нарушение общего доступа к файлам происходит после создания файла?

Итак, я пытаюсь создать файл .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;
    }

Есть идеи, почему эта собака не охотится?


person Catlard    schedule 14.01.2013    source источник
comment
Может быть, File.Create держит его открытым? Я всегда просто позволял StreamWriter создавать файл.   -  person Jason Massey    schedule 14.01.2013


Ответы (5)


Есть ли причина, по которой вы хотите создать файл, а затем снова открыть его, чтобы записать в него. StreamWriter имеет метод, который только то. Он создаст новый файл, если он не существует.

Из ссылки выше:

Инициализирует новый экземпляр класса StreamWriter для указанного файла по указанному пути, используя кодировку по умолчанию и размер буфера. Если файл существует, его можно либо перезаписать, либо дополнить. Если файл не существует, этот конструктор создает новый файл.

person Mark Hall    schedule 14.01.2013
comment
Фантастический. Я попробую это. Ваше здоровье. - person Catlard; 14.01.2013
comment
Сработало удовольствие. Спасибо, Марк. - person Catlard; 14.01.2013

StreamWriter не смог получить доступ к файлу, потому что File.Create вернул FileStream, который вы не использовали.

Как упоминалось выше, File.Create не требуется. Вы также можете использовать:

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

который будет потреблять файловый поток и закрывать его. Всякий раз, когда вы работаете с потоками и большинством классов, которые взаимодействуют с потоками, обязательно используйте блок using(), чтобы обеспечить правильное освобождение дескрипторов.

person Steve Py    schedule 14.01.2013

Это может происходить из-за того, что StreamWriter еще не освободил неуправляемые ресурсы: попробуйте использовать блок using вместо того, чтобы открывать и закрывать его вручную.

using (StreamWriter writer = new StreamWriter(statusTxtPath))
    {
        // do work here
    }
person Yusubov    schedule 14.01.2013

Я новичок в этом языке программирования, я знаю немного Ansi C в основном из программирования микроконтроллеров, но сейчас я изучаю C #, и у меня была такая же проблема.

System.IO.IOException
Нарушение общего доступа по пути /.../...

Я обнаружил, что следующий код вызывает исключение.

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

Решение, которое я нашел для решения этой проблемы, на самом деле использует меньше и более простой код.

File.AppendAllText(path, str);

С помощью этой строки программа откроет файл, если он уже существует, и добавит текст в его конец, если он не существует, создаст его и добавит текст.

Бытие: path -> путь к файлу
str -> текст, который вы хотите записать в файл

Я нашел подсказку для решения на этой странице форума Xamarin.

person Rui Santos    schedule 01.04.2017

Я также сталкиваюсь с той же проблемой с многопоточным программированием, я думаю, что это проблема синхронизации потоков, но проблема заключается в том, что после File.Create() я использовал StreamWriter. Здесь вы можете попробовать вместо двух разных шагов объединить их в один. этот код отлично работает для меня.

using (var writer = new StreamWriter(File.Exists(path) ? File.Open(path, FileMode.Open) : File.Create(path)))
{
    writer.Write(str);
    writer.Close();
}
person Rohit kshirsagar    schedule 15.12.2017
comment
Похоже, это не отвечает на вопрос о нарушении совместного использования. - person Bob G; 15.12.2017