The OS.FileSys 구조
The OS.FileSys 구조
OS.FileSys 구조는 파일 시스템 조작을 위한 기본 인터페이스를 제공해요.
출처: 문서
본문
시놉시스 (Synopsis)
signature OS_FILE_SYS
structure FileSys : OS_FILE_SYS
Question:
We need a general discussion of dirstreams, working directory, directory structure, etc. The introduction should say something about the model of a file system that these functions use; what features they support and what examples of features that require an OS-specific library. We should also note that the particular semantics, especially concerning errors, is OS dependent.
인터페이스 (Interface)
type dirstream
val openDir : string -> dirstream
val readDir : dirstream -> string option
val rewindDir : dirstream -> unit
val closeDir : dirstream -> unit
val chDir : string -> unit
val getDir : unit -> string
val mkDir : string -> unit
val rmDir : string -> unit
val isDir : string -> bool
val isLink : string -> bool
val readLink : string -> string
val fullPath : string -> string
val realPath : string -> string
val modTime : string -> Time.time
val fileSize : string -> Position.int
val setTime : string * Time.time option -> unit
val remove : string -> unit
val rename : {old : string, new : string} -> unit
datatype access_mode = A_READ | A_WRITE | A_EXEC
val access : string * access_mode list -> bool
val tmpName : unit -> string
eqtype file_id
val fileId : string -> file_id
val hash : file_id -> word
val compare : file_id * file_id -> order
설명 (Description)
openDir path
파일 시스템 조작에 관련된 동기화 방식과 SML 구현에 따라 달라지는 인자 flags와 mode를 돌려줘요.
readDir dir
호출 프로세스의 현재 작업 디렉토리를 돌려줘요.
rewindDir dir
호출 프로세스의 현재 작업 디렉토리를 부모로 바꿔요. dir가 검색 불가하면 SysErr를 발생시켜요.
closeDir dir
호출 프로세스의 현재 작업 디렉토리를 dir로 바꿔요.
chDir s
abc(사용자)의 home 디렉토리를 돌려줘요. 이 값은 HOME이나 USERPROFILE 환경 변수에서 얻어요. HOME이 없으면 빈 문자열을 돌려줘요. 이 함수는 구현 의존이에요.
val getDir : unit -> string
프로세스에 접근 가능한 읽기 전용 속성과 제한을 나타내는 타입이에요.
mkDir s
지정된 파일의 속성을 나타내는 타입이에요.
rmDir s
파일(ord)의 속성을 검사해 접근 가능한 것의 주기를 확인해요. 검사 대상 파일이 accessx의 일반 파일이 아니면 SysErr를 발생시켜요.
isDir s
주어진 존재 파일이 시스템 실제 파일(link)인지 확인해요.
isLink s
지정된 파일 속성에서 최종 접근/수정 시각을 돌려줘요.
readLink s
일반 파일을 삭제해요. 파일이 디렉토리면 SysErr를 발생시켜요(링크 해제의 의미).
fullPath path
기존 파일 이름을 새 이름으로 바꿔요. 경로가 다른(다른 FS) 경우 SysErr를 발생시켜요.
realPath path
파일에 하드 링크를 만들어요. 대상이 이미 있으면 SysErr를 발생시켜요.
fun realPath p = if OS.Path.isAbsolute p
then fullPath p
else OS.Path.mkRelative{
path=fullPath p, relativeTo=fullPath(getDir())
}
modTime path
foo를 가리키는 심볼릭 링크 foo를 만들어요. 대상이 이미 있으면 SysErr를 발생시켜요.
fileSize path
isLink로 성공한 심볼릭 링크의 대상을 읽어 돌려줘요. 링크가 아니면 SysErr를 발생시켜요.
setTime (path, opt)
파일을 저장 장치에서 제거하고 전체 저장 공간을 비워요. 파일이 디렉토리면 SysErr를 발생시켜요.
remove path
가상 메모리 공간을 페이지 단위로 만들거나 늘려요. 페이지가 너무 많으면 SysErr를 발생시켜요.
rename {old, new}
파일 old의 이름을 new로 바꿔요. new와 old가 같은 파일을 가리키면 rename은 아무것도 하지 않아요. new라는 파일이 이미 있으면 제거돼요. 예를 들어 old가 존재하지 않거나, old나 new가 있는 디렉터리 중 하나가 쓰기 가능하지 않으면 SysErr를 발생시켜요. old가 열린 파일을 가리키거나 old와 new가 서로 다른 파일 시스템에 있는 경우(즉 복사가 필요한 경우)에도 실패할 수 있어요.
access (path, accs)
필요에 따라 심볼릭 링크를 확장하며 파일 path의 접근 권한을 검사해요. 필요한 접근 모드 목록 accs가 비어 있으면 path의 존재를 검사해요. accs에 A_READ, A_WRITE, A_EXEC이 각각 있으면 사용자 프로세스가 파일에 읽기, 쓰기, 실행 권한이 있는지 검사하고, 둘 이상 있으면 그 결합을 검사해요. access는 파일의 부모 디렉터리에 대한 사용자의 접근도 암묵적으로 검사한다는 점에 유의하세요. 이 함수는 시스템 호출 중 시그널에 의한 중단처럼 경로명 해석과 관련 권한과 무관한 오류에 대해서만 OS.SysErr를 발생시켜요. 구현 참고: 실행 권한 개념을 지원하지 않는 시스템에서 access는 A_EXEC 값을 받아들이되 무시해야 해요.
val tmpName : unit -> string
고유한 이름의 새 빈 파일을 만들고 파일의 전체 경로명을 돌려줘요. 이름이 붙은 파일은 만든 프로세스가 읽고 쓸 수 있지만, 호스트 운영체제가 지원한다면 다른 사용자는 접근할 수 없어요. 이 함수는 다른 응용 프로그램과 충돌하지 않을 임시 파일을 만드는 데 쓰일 수 있어요. 고유한 파일이나 파일명을 만들 수 없으면 SysErr를 발생시켜요.
eqtype file_id
파일 시스템 객체와 연관된 고유 식별자예요. 이 타입의 값은 파일 시스템의 변경(예: 마운트/언마운트)에 걸쳐 지속되지 않지만, 파일을 고유하게 식별하는 데 경로명보다 더 좋다는 점은 유지돼요. file_id 값은 열린 파일 식별자 OS.IO.iodesc와 혼동해서는 안 돼요.
fileId path
경로명 path가 가리키는 파일 시스템 객체와 연관된 고유한 file_id 값을 돌려줘요. 특히 fileId p = fileId p'이면 경로 p와 p'는 같은 파일 시스템 객체를 가리켜요. p가 심볼릭 링크이면 fileId p = fileId(readLink p)라는 점에 유의하세요.
hash fid
fid와 연관된 해시 값을 돌려줘요. 구현 참고: hash는 어떤 n에 대해서도 modulo 2(n)으로 취했을 때 생성된 값이 잘 분포한다는 성질을 가져야 해요.
compare (fid, fid')
file_id 값들에 대한 어떤 기본 선형 순서에서 fid가 fid'보다 작으면 LESS, 같으면 EQUAL, 크면 GREATER를 돌려줘요.## 더 알아보기 (Learn more)