삽질 기록.

내가 갖고 있는 것
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.07.29 16:42
  • 고양이처럼 2009.07.29 18:15 신고 ADDR EDIT/DEL REPLY

    파일 위치를 상대경로로 쓰면 안되나? 안되면 할 수 없지만..ㅎㅎ;
    암튼 즐 삽~!

    • snowall 2009.07.29 23:02 신고 EDIT/DEL

      안됩니다 -_-;
      음...그거랑 상관 없는 문제였어요.
      ReadLine 메소드가 Close랑 Dispose를 해준 이후에도 계속 파일 핸들러를 붙들고 있어서 WriteLine이 파일을 못 들고 오는 오류인데요...
      그냥 메소드를 바꿔서 해결했습니다.
      이틀간 삽질 끝에. -_-;

  • Lex 2009.07.30 10:39 ADDR EDIT/DEL REPLY

    베이직은 대학교 때, MFC 배운다고 베이스로 배운거 외에는 공부한 적이 없어서 잘 모르지만, 궁금해서 MSDN을 함 뒤져봤습니다.

    기본적으로 WriteAllText가 File System과 연결된 함수입니다. 그리고, WriteLine은 Console과 연결된 함수이구요. 그런데, WriteAllLine은 닷넷으로 넘어가면서 생긴 오버로드된 함수입니다. System과 연결이 되어서 WriteAllText랑 똑같은 기능을 합니다. 그리고, WriteLine은 그대로 Console과 연결된 함수입니다.

    아마도, Console function을 File I/O에 써서 오류가 발생한 것 같습니다. 그리고, 참고로 C에서는 기본적으로 옵션을 넘겨서 Console과 File I/O를 설정할 수 있는데, 베이직에서는 나뉘어 있는 듯 합니다.

    대충 솔루션입니다. ^^;

    • snowall 2009.07.30 10:45 신고 EDIT/DEL

      그게 오류의 근본적인 원인이었군요. 알려주셔서 감사합니다. ^^
      VB는 MSDN말고는 인터넷을 아무리 찾아봐도 VB2005 내용은 안나와서요. 인터넷에 있는건 전부 VB6.0에 대한 내용이고...
      MSDN은 좋긴 한데 너무 방대해서 거기서 삽질하느니 그냥 해결했으니 다행이다 이렇게 생각하고 있었거든요.
      아무튼 감사합니다.