ANSI에서는 파일 I/O 관련 함수를 정의해두고 있음.
해당 표준 함수를 쓰면 운영체제에 상관없이 파일이 생성되고 파일 관련 연산 등을 할 수 있다.
하드웨어가 하나 있다고 가정. 해당 하드웨어에는 OS가 설치되어 있음.
OS 위에서 프로그램을 동작. 파일을 생성하면 해당 파일이 하드디스크에 저장.
파일이 저장되는 방식은 File System에 의존적.
이 때 파일을 어떻게 저장할 것이냐, 즉 파일 자체를 어떻게 정의하고 구성할 것인지가 중요.
파일은 운영체제의 일부이자 운영체제에서 구현한 독립적인 시스템.
파일 관련 함수를 사용할 때 ANSI 표준 함수를 호출하지만, 실제 파일을 만드는 것은 OS.
ANSI 표준 함수가 구현되기 이전 Windows가 제공하는 System 함수가 먼저 존재.
Windows라는 OS에서 파일을 만드려면 이 System 함수를 사용하면 됨.
ANSI 표준 함수의 내부를 보면 해당 OS의 System 함수를 호출하고 있음. ex) fopen()
다시 말해 ANSI 표준 함수가 실제로 파일을 만드는 역할을 하는건 아니고, System 함수를 감싸고 있는 껍데기.
ANSI 표준 함수는 모든 OS의 공통분모만 함수로 제공함. 만약 사용자가 세밀한 파일 작업을 해야 한다면 각 OS가 제공하는 File System 함수를 사용할 필요가 있다.
파일 생성
CreateFile()
입력 및 출력
ReadFile(), WriteFile()
파일 종료
CloseHanlde()
파일도 커널이 관리하는 리소스이기 때문에 파일 생성 시 커널 오브젝트가 생성되고, 해당 커널 오브젝트의 핸들이 반환된다.
File Pointer: 파일을 어디까지, 몇 바이트까지 읽었는지에 대한 정보를 저장해서 어디서부터 다시 읽어올지 컨트롤.
파일 정보를 얻을 때 핸들을 통해 얻을지, 이름을 통해 얻을지 두 가지를 고려해야 한다.
일반적으로 새로운 파일을 생성하는게 아닌 이상 핸들을 통해 얻는 함수가 더 유용하다.
fseek(): 파일 포인터를 이동하는 함수
32비트 시스템에서는 파일의 최대 크기가 4GB 기준. 파일의 크기가 4GB보다 작으면 32비트로 표현 가능하지만, 이보다 크면 32비트로 표현할 수 없기 때문에 만들 수 없었음.
파일의 크기가 4GB일 경우, 파일의 주소가 0 ~ 4GB - 1 Byte 내에 위치할 것.
따라서 파일 주소 4GB에 위치한 데이터를 얻고자 하면 4GB를 표현할 수 있어야 함.
32비트 시스템에서 표현할 수 있는 주소 값의 최대 크기가 4GB이기 때문에 파일의 최대 크기도 4GB.
32비트 기반64비트 기반dwPtrLow = SetFilePointer(...)
if ((INVALIDE_SET_FILE_POINTER == dwPtrLow)
&& (NOERROR != GetLastError()))
{ ..진짜 오류.. }