안녕하세요!!
네 직장인 2년차 뉴비입니다, 선배님들 잘 부탁드립니다! ^–^
저는 제조업 회사에 재직중이며 C# 을 활용해 물류 이동이나 상태표시 등 간단한(?) 작업을 하고 있습니다.
그리고 프로그램에서는 Timer 를 통해 물류 관련 항목을 Logging 작업으로 엑셀에 저장하고 있습니다.
- 무엇을 하고자 하는지
프로그램에서 Logging 작업을 하면서 작업자가 해당 Excel 파일을 간섭없이 열람하고 싶습니다.
- 현재 작성한 코드 중 문제가 되는 부분
기존 코드
using (swSave = new StreamWriter(strFilePath, true, Encoding.UTF8))
{
swSave.WriteLine(strBld);
}
-
using 문을 활용해 swSave(StreamWriter) 를 생성하여 경로(strFilePath) 에 데이터(strBld) 를 Write 합니다.
-
하지만 작업자가 Excel 파일을 Open 한다면, 매초 swSave 가 생성될 때, 해당 경로 파일이 이미 열려 있으므로 IOException 발생 → 발생 시간동안 Log Data 누락
-
기대하는 동작
대안 1. Excel 파일 속성을 읽기전용으로 설정한다.
정말 1차원적인 생각이였습니다… 읽기전용으로 하니 swSave 를 생성할 때, 해당 경로 파일 접근이 불가했습니다.
대안 2. FileStream 속성을 지정한다.
FileStream fsSave = new FileStream(strFilePath, FileMode.Append, FileAccess.Write, FileShare.Read);
using (swSave = new StreamWriter(fsSave, Encoding.UTF8))
{
swSave.WriteLine(strBld);
}
- FileMode(Path의 파일을 가지고 할 행동을 나타냅니다) : Append (파일을 열고 파일의 끝까지 검색하거나 새 파일을 만듭니다.)
- FileAccess(내가(본인 프로세스) 이 파일을 열 때에 지정할 권한을 의미) : Write (파일에 쓸 수 있습니다.)
- FileShare(다른 프로세스(스레드)가 파일을 열 때 가질 수 있는 권한을 지정) : Read (다른 프로세스가 파일을 읽을 수 있습니다.)
프로그램에서는 Write 하면서 작업자는 Read 속성으로 파일을 Open 하면 될 줄 알았습니다.
하지만 아래와 같은 두가지 case 가 반복 됬습니다.
case 1) 파일이 Write 중일 때, 작업자가 Open 한 경우 ( 프로그램이 선점한 경우 )
해당 경우는 Excel 에서 읽기전용으로 Open 할지 물어봅니다. 그러면 데이터 열람도 가능하고 Write 도 정상적으로 동작합니다.
case 2) 파일이 아직 Write 안할 때, 작업자가 먼저 Open 한 경우 (다른 프로세스가 선점한 경우 )
해당 경우는 Excel 은 일반 파일처럼 열리고 바로 swSave 에서 해당 파일이 열렸으므로 IOException 이 발생합니다.
끝으로 쓰다보니 말이 길었습니다.
사실 요즘 느끼는 생각은 궁금한 내용에 대해서 찾아보거나 테스트 해보지 않은 상태에서 두루뭉실하게 검색을 하다보니 원하는 정보를 찾지 못하는거 같습니다. 뭔가 프로그래밍하면서 똑같은 코드를 반복해 매너리즘(?) 에 빠지는 느낌도 드는거 같구요. 뭔가 이번 계기로 프로그램을 개선해나가면서 당연하다고 생각했던 부분들을 뜯어 고치고 싶습니다.
좋은 방법과 도움될만한 정보도 모두 환영입니다!
감사합니다!
–참고 URL : https://chashtag.tistory.com/49