삽질 기록.

내가 갖고 있는 것
labels()  :  몇가지 이름이 들어있는 배열
config.txt : labels()가 저장되는 파일

원하는 것
config.txt에 labels()의 내용을 쓰고 싶은데, 이미 있는 내용이라면 그냥 놔두고 없으면 끝에다 추가한다

현재 구현된 상태
readline(config.txt)으로 불러오고
적당한 비교 구문으로 찾아본 후
없는 애들만 골라서
writeline(config.txt)으로 저장

그런데 오류 발생. IOexception 에러. 분명히 readline 후에 dispose하고 close했는데도 다른 프로세스가 그 파일을 붙들고 있다면서...
소스 코드
'이 코드는 snowall이 직접 작성한 코드이다.
'이 코드는 Public Domain License를 적용받는다.
    Private Sub saveConfig()
        Dim j As Integer
        Dim i As Integer
        Dim tmp As System.IO.FileStream
        If Not (System.IO.File.Exists("C:\TOFconfig.txt")) Then
            tmp = System.IO.File.Create("C:\TOFconfig.txt")
            tmp.Close()
            tmp.Dispose()

        End If
        MsgBox(System.IO.File.ReadAllLines("C:\TOFconfig.txt").Length)

        Dim labels(0) As String
        If System.IO.File.ReadAllLines("C:\TOFconfig.txt").Length Then
            ReDim Preserve labels(System.IO.File.ReadAllLines("C:\TOFconfig.txt").Length)
            For i = 0 To labels.Length - 1
                labels(i) = System.IO.File.ReadAllLines("C:\TOFconfig.txt")(i)
            Next
        End If

        Dim flag As Boolean = False
        MsgBox(labels(labels.Length - 1))
        For j = 0 To frmMainWindow.numberOfData - 1
            For i = 0 To labels.Length - 1
                If Not (labels(i) Is Nothing) Then
                    If labels(i).StartsWith(frmMainWindow.clsSignalData(j).label) Then
                        labels(i) = frmMainWindow.clsSignalData(j).label & frmMainWindow.clsSignalData(j).intChannel
                        flag = True
                    End If
                End If
            Next
            If Not (flag) Then
                ReDim Preserve labels(labels.Length)
                labels(labels.Length - 1) = frmMainWindow.clsSignalData(j).label & frmMainWindow.clsSignalData(j).intChannel
            End If
            flag = False
        Next

        Dim objfilew As New System.IO.StreamWriter("C:\TOFconfig.txt")
        For i = 0 To labels.Length - 1
            objfilew.WriteLine(labels(i))
        Next
        objfilew.Close()
        objfilew.Dispose()
End Sub

위에서 파랗게 칠해둔 부분이 오류임.

해결된줄 알았는데 아직 해결이 안됐다. 어디의 무엇이 문제일까. -_-;

해결 방법
C:\를 E:\로 바꾸었음
Writeline을 WriteAllLine 으로 바꾸었음

원인
윈도 Vista에서 C:\는 보안상 접근을 허락하지 않는고로, 이래저래 괴로운 일이 발생함.
모름. 도대체...

결론
윈도 Vista가 쓰레기.
어쨌든 윈도 Vista는 쓰레기.

잠재적 문제점
E:\가 없는 컴퓨터에서 작동시킬 때 100% 확률로 오류 발생.
이 프로그램을 작동시킬 컴퓨터는 윈도 XP가 설치되어 있으므로 C:\로 하더라도 문제가 없을 것임.
개발은 E:\로 해놓고 배포는 C:\로 해야 하는 딜레마 상황.
잠재적이라서 모름.

디버깅하는데 걸린 시간
2 업무일 + 야근 8시간

잠재적 결론
빌어먹을.
by snowall 2009. 7. 29. 16:42