본문 바로가기
C#

[C#] IOException: Sharing violation on path 에러 해결

by 아마도개발자 2024. 8. 22.

 

Unity에서 json파일을 로컬로 생성할일이 생겼다. 처음엔 별 생각없이 파일을 생성하고, 내용을 넣어주면 될 것이라고 생각하고 코드를 짰다.

File.Create(settingDataPath);
File.WriteAllText(settingDataPath, JsonConvert.SerializeObject(setting));

 

settingDataPath라는 파일을 생성하고,  setting이라는 Object를 직렬화해서 write하려했는데 IOException이 발생했다.

 

IOException은 주로 파일이 이미 열려있거나, 다른 프로세스에 의해 사용 중일 때 발생한다고 한다. 정황상 WriteAllText가 실행될 때, Create가 정상적으로 종료되지 않은 것이라고 생각되어 찾아보니 

 

File.Create는 새로운 파일을 생성하고, 이 파일에 대한 FileStream을 반환합니다. 이 반환된 스트림을 닫지 않으면, 파일은 여전히 다른 프로세스에 의해 사용 중인 상태로 남아 있게 됩니다.

 

라는 것을 확인했다. 결국 반환된 FileStream이 제대로 닫히지 않은 상태에서 WriteAllText를 했기 때문에 에러가 발생한 것이었다.

 

이를 해결할 수 있는 가장 보편적인 방법은 Stream클래스를 사용하는 것이다.

 

Stream이란?

C#에서 Stream 클래스는 .NET의 기본 입출력(IO) 추상화 클래스이다. Stream은 데이터의 바이트 시퀀스에 대한 읽기, 쓰기 및 탐색을 위한 공통 인터페이스를 제공한다. 또한 파일, 메모리, 네트워크 및 다른 여러 소스에서 데이터를 읽고 쓸 수 있도록 다양한 파생 클래스를 제공한다.

 

주요 파생 클래스로는 FileStream, MemoryStream, CryptoStream, StreamReader, StreamWriter 등이 있다.

 

여기서 파일을 작성하는데 사용되는 StreamWriter를 사용하여 위 에러를 해결해보면

using (var streamWriter = new StreamWriter(settingDataPath, true))
{
    streamWriter.Write(JsonConvert.SerializeObject(setting));
}

 

이런 형태가 될 것이다.

 

c#에서 대표적으로 파일을 다를 수 있는 방법들이 System.IO.File 클래스를 사용하거나 이 Stream을 이용하는 것이다. 직관적이고 사용이 쉬운 File에 비해 Stream은 어느 정도 학습이 필요하므로 Stream에 대해 구체적으로 정리해보도록 하자.