Visual Basic에서 파일 읽고 쓰기 삽질

삽질 기록.

내가 갖고 있는 것

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시간

잠재적 결론

빌어먹을.






코멘트

“Visual Basic에서 파일 읽고 쓰기 삽질”에 대한 4개 응답

  1. 
                  snowall
                  아바타

    그게 오류의 근본적인 원인이었군요. 알려주셔서 감사합니다. ^^

    VB는 MSDN말고는 인터넷을 아무리 찾아봐도 VB2005 내용은 안나와서요. 인터넷에 있는건 전부 VB6.0에 대한 내용이고…

    MSDN은 좋긴 한데 너무 방대해서 거기서 삽질하느니 그냥 해결했으니 다행이다 이렇게 생각하고 있었거든요.

    아무튼 감사합니다.

  2. 
                Lex
                아바타
    Lex

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

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

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

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

  3. 
                  snowall
                  아바타

    안됩니다 -_-;

    음…그거랑 상관 없는 문제였어요.

    ReadLine 메소드가 Close랑 Dispose를 해준 이후에도 계속 파일 핸들러를 붙들고 있어서 WriteLine이 파일을 못 들고 오는 오류인데요…

    그냥 메소드를 바꿔서 해결했습니다.

    이틀간 삽질 끝에. -_-;

  4. 
                 fltoll
                 아바타

    파일 위치를 상대경로로 쓰면 안되나? 안되면 할 수 없지만..ㅎㅎ;

    암튼 즐 삽~!

Lex 에 응답 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.