Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[8008] Re:[질문] i/o error 183 아시는분...
김성규 [] 2459 읽음    2002-03-16 10:12
EzyRyder 님이 쓰신 글 :
: : : : : : :
 
:
 안녕하세요?
:
 델파이 4.0에서 OpenDialog를 사용해서 파일(*.dat)을 연다음
:
 그파일을 가지고 파라독스용 DB파일(*.db)을 만드는걸 하는데..
:
 첨엔 아주 잘됐죠..
:
 그런데 어느날 부터 갑자기 I/O error 183 이란 메세지가 나오면서 안되는데...
:
 감이 안잡힙니다..예? 제 질문이 감이 안잡히신다구요? ㅡ.ㅡ;;;
:
 파일입출력에러 같은데...뭐가 문제인지..
:
 저와 같은 경험을 가지고 계신분들 도와주세요. ㅜㅜ
: :
:

IO Error 183 이거.. 제가 try 문을 사용하게 만든놈이죠.
그전에는 에러처리는 대충했었는데.. 그 이후로 파일은 모두
Stream 을 이용합니다.

말씀하신대로 파일 입출력 에러입니다.
그러니까.. 파일 입출력할때 뭔가 잘못되었다는 거죠.
읽으려고 하는데 읽을 수 없거나,
파일을 생성하려 하는데 생성을 할 수 없거나.
파일에 쓰려고 하는데 쓰지 못하거나.

문제는 이게 언제 발생하느냐 하는 겁니다.
이거 찾기가 쉽지 않더군요.

Stream을 사용하셨다면 모든 에러처리를 Exception으로 하기 때문에
에러가 발생한 곳을 바로 알 수 있습니다. 하지만 exception으로 처리하지
않는 일반 파일 API들은 쓰다 잘못된 건지.. 잘 못 열어 못쓰는 건지..
모른다 이거죠.

이 에러가 나버리면 파일이 닫히지 않기 때문에 다시 오픈하거나
쓰거나 읽을 수 없습니다. 파일 작업을 더이상 할 수 없는 거죠.

또 한가지 중요한건 i/o 183 에러는 익셉션 입니다.

또 에러코드로 에러를 체크할 수 있는 함수 내부에서 발생하기 때문에
결국 try 문을 이용해서 익셉션 처리를 해주어야 합니다.

Divide by zero 같은 것 처럼요.

저는 다음과 같은 형식으로 사용합니다.

Stream := TFileStream.Create(FileName, fmCreate);
try
    1...
    2...
    3...
finally
  Stream.Free;
end;

finally 섹션은 익셉션이 나도 무조건 통과하게 되어 있습니다.
익셉션이 나면 모든 스택을 거슬러 올라가면서 익셉션 처리 루틴이 있는 곳까지
함수를 되돌립니다. 따라서 1. 번에서 에러가 나면 2.번 3번은 안거치고 건너가지요
try.. finally.. 구문이 없다면 Stream.Free도 안거칩니다.

따라서 파일이 닫히지 않지요. 다시 쓰려면 사용중이되어 다시 못씁니다.
프로그램을 종료했다 다시 실행시켜야 하지요.

파일이 아니라 메모리라면 메모리 누수가 발생하게 됩니다.

하지만 finally 안에 있는 구문은 1.2.3번 수행 중 익셉션이 *발생하건* *안하건* (중요)
이 함수에서 빠져 나가기 전에 무조건 거치게 되어 있습니다.

따라서 파일작업에서 문제가 발생했건 안했건 파일은 닫히고 그 상위 함수에서
try..   except 구문으로 에러 발생시 대처(보통은 메세지 띄워 주는거) 할 수 있고
같은 작업을 다시 시도할 수 있지요. 프로그램이 훨씬 안정적이 됩니다.

개인적으로 스트림과 익셉션 핸들링을 사용하시기를 권합니다.

델파이에서 익셉션을 사용하기 때문에 결국 단단한 프로그램을 만드려면 어짜피
처리해야할 것이 익셉션이고.. 익숙해지면 정말 편하거든요.


마지막으로 한가지 팁

이라면 AssignFile 등을 사용하시다 스트림을 사용하시면 엄청 느리다는 걸 느끼실
수 있을 겁니다. 아마 한 10배는 더 느릴 겁니다.

버퍼링을 안하거든요. ^^; TReader, TWriter를 같이 사용해주세요. 이게 버퍼링
해줍니다. 또 멤버함수에 편한 함수들 많습니다. ReadString, ReadInteger WriteInteger, WriteString 등등..

Stream := TFileStream.Create(FileName, fmCreate);
try
  Writer := TWriter.Create(Stream, 2048);  // 요거 확실하지 않은데.. 비슷할 겁니다. 버퍼크기.
  try
    WriteInteger(100);
    ...
  finally
    Writer.Free;
  end;
finally
  Stream.Free;
end;

+ -

관련 글 리스트
8002 [질문] i/o error 183 아시는분... EzyRyder 842 2002/03/13
16052     Re:[질문] i/o error 183 아시는분... 지나는이 642 2019/09/05
8008     Re:[질문] i/o error 183 아시는분... 김성규 2459 2002/03/16
8004     Re: 안녕하세여.. 타락임다..^^ 타락천사 1173 2002/03/13
8003     Re:[질문] i/o error 183 아시는분... 류종택 4052 2002/03/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.