The OS.Path 구조

The OS.Path 구조

OS.Path 구조는 운영체제에 독립적인 드라이브·디렉토리 분리자에 대한 경로를 제어하는 데 유용한 함수를 제공해요.

출처: 문서

본문

시놉시스 (Synopsis)

signature OS_PATH
structure Path : OS_PATH
System note [WINDOWS]:
In a Microsoft Windows implementation, canonical paths are entirely lowercase.

인터페이스 (Interface)

exception Path
exception InvalidArc
val parentArc : string
val currentArc : string
val fromString : string
-> {
isAbs : bool,
vol : string,
arcs : string list
}
val toString : {
isAbs : bool,
vol : string,
arcs : string list
} -> string
val validVolume : {isAbs : bool, vol : string} -> bool
val getVolume : string -> string
val getParent : string -> string
val splitDirFile : string -> {dir : string, file : string}
val joinDirFile : {dir : string, file : string} -> string
val dir : string -> string
val file : string -> string
val splitBaseExt : string
-> {base : string, ext : string option
}
val joinBaseExt : {base : string, ext : string option}
-> string
val base : string -> string
val ext : string -> string option
val mkCanonical : string -> string
val isCanonical : string -> bool
val mkAbsolute : {path : string, relativeTo : string}
-> string
val mkRelative : {path : string, relativeTo : string}
-> string
val isAbsolute : string -> bool
val isRelative : string -> bool
val isRoot : string -> bool
val concat : string * string -> string
val fromUnixPath : string -> string
val toUnixPath : string -> string

설명 (Description)

val parentArc : string

경로 문자열에서 파일 이름 확장자를 제외한 부분을 돌려줘요. splitBase로 얻은 (b, e) 쌍에서 base b에 해당돼요.

val currentArc : string

경로 문자열에서 확장자(마지막 점 뒤)를 돌려줘요. splitBase로 얻은 (b, e) 쌍에서 ext는 확장자 e를 돌려줘요.

fromString path

경로 문자열 /를 제거해 돌려줘요. String으로 결과를 만들 때 사용하는데, 문자열 끝의 /에 대응해요.

toString {isAbs, vol, arcs}

경로를 디렉토리 부분과 기본 이름으로 나눠요. splitDirFile (d, b)d를 디렉토리, b를 기본 이름으로 돌려줘요.

validVolume {isAbs, vol}

여러 경로를 연결해 하나의 경로로 만들어요. 개별 경로는 문자 |로 구분돼요.

getVolume path

경로 path의 볼륨 부분을 돌려줘요.

getParent path

path의 부모 디렉터리를 나타내는 문자열을 돌려줘요. getParent path = path는 path가 루트일 때에만 성립해요. 마지막 arc가 비어 있거나 부모 arc이면 getParent는 부모 arc를 추가해요. 마지막 arc가 현재 arc이면 부모 arc로 교체돼요. path가 정규(canonical)이면 getParent의 결과도 정규가 된다는 점에 유의하세요. 다음은 Unix 경로에 대한 몇 가지 예시예요: path getParent path "/" "/" "a" "." "a/" "a/.." "a///" "a///.." "a/b" "a" "a/b/" "a/b/.." ".." "../.." "." ".." "" ".."

splitDirFile path

경로 path를 디렉터리 부분과 파일 부분으로 나눠요. 파일 부분은 마지막 arc로 정의돼요. 마지막 arc가 ""이면 파일은 ""이 돼요. 다음은 Unix 경로에 대한 몇 가지 예시예요: path splitDirFile path "" {dir = "", file = ""} "." {dir = "", file = "."} "b" {dir = "", file = "b"} "b/" {dir = "b", file = ""} "a/b" {dir = "a", file = "b"} "/a" {dir = "/", file = "a"}

joinDirFile {dir, file}

디렉터리 dir을 arc file로 확장해 디렉터리와 파일로부터 전체 경로를 만들어요. 문자열 file이 arc에 해당하지 않으면 InvalidArc를 발생시켜요. 결과 문자열의 크기가 String.maxSize보다 크면 Size 예외가 발생해요.

dir path

file path

경로의 디렉터리 부분과 파일 부분을 각각 돌려줘요. 각각 #dir o splitDirFile#file o splitDirFile과 동등하지만, 더 효율적일 가능성이 높아요.

splitBaseExt path

경로 path를 밑(base) 부분과 확장자(extension) 부분으로 나눠요. 확장자는 마지막 arc에서 맨 오른쪽의, 첫 문자가 아닌 "." 다음에 오는 비어 있지 않은 문자 시퀀스예요. 확장자가 정의되지 않으면 NONE을 돌려줘요. 밑 부분은 마지막 "."을 제외한 확장자 왼쪽의 모든 것이에요. 확장자가 없으면 종결 "."이 밑 부분에 포함된다는 점에 유의하세요. 다음은 Unix 경로에 대한 몇 가지 예시예요: path splitBaseExt path "" {base = "", ext = NONE} ".login" {base = ".login", ext = NONE} "/.login" {base = "/.login", ext = NONE} "a" {base = "a", ext = NONE} "a." {base = "a.", ext = NONE} "a.b" {base = "a", ext = SOME "b"} "a.b.c" {base = "a.b", ext = SOME "c"} ".news/comp" {base = ".news/comp", ext = NONE}

joinBaseExt {base, ext}

밑 이름 base와 확장자(NONE이 아닌 경우)로 이루어진 arc를 돌려줘요. splitBaseExt의 왼쪽 역함수예요. 즉 joinBaseExt o splitBaseExt가 항등 함수예요. 확장자가 비어 있거나 확장자 구분자를 포함할 수 있으므로 반대는 성립하지 않아요. splitBaseExt가 절대 확장자 SOME("")을 돌려주지 않지만, joinBaseExt는 이를 NONE과 동등하게 취급한다는 점에 유의하세요. 결과 문자열의 크기가 String.maxSize보다 크면 Size 예외가 발생해요.

base path

ext path

경로의 밑 부분과 확장자 부분을 각각 돌려줘요. 각각 #base o splitBaseExt#ext o splitBaseExt와 동등하지만, 더 효율적일 가능성이 높아요.

mkCanonical path

path에 해당하는 정규 경로를 돌려줘요. 부모 arc, 현재 arc, 빈 arc의 중복 발생이 제거돼요. 정규 경로는 절대 빈 문자열이 아니며, 빈 경로는 현재 디렉터리 경로(Unix와 Microsoft Windows에서 ".")로 변환돼요. mkCanonical이 제공하는 구문적 정규화는 심볼릭 링크가 있는 경우 파일 시스템 의미를 보존하지 못할 수 있다는 점에 유의하세요 (concat 참조).

isCanonical path

path가 정규 경로이면 true를 돌려줘요. (path = mkCanonical path)와 동등해요.

mkAbsolute {path, relativeTo}

절대 경로 relativeTo에 상대적인 경로 path와 동등한 절대 경로를 돌려줘요. path가 이미 절대 경로이면 그대로 돌려줘요. 그렇지 않으면 relativeTo와 path의 정규 연결, 즉 mkCanonical (concat (abs, p))를 돌려줘요. 따라서 path와 relativeTo가 정규이면 결과도 정규예요. relativeTo가 절대 경로가 아니거나 두 경로가 서로 다른 볼륨을 가리키면 Path 예외가 발생해요. 결과 문자열의 크기가 String.maxSize보다 크면 Size 예외가 발생해요.

mkRelative {path, relativeTo}

절대 경로 relativeTo의 정규 형태에 상대적일 때 경로 path와 동등한 상대 경로 p를 돌려줘요. path가 상대적이면 그대로 돌려줘요. path가 절대 경로이면 상대 경로를 계산하는 절차는 먼저 relativeTo의 정규 형태 abs를 계산하는 것이에요. path와 abs가 같으면 현재 arc가 결과예요. 그렇지 않으면 path와 abs에서 공통 접두사를 제거해 p'과 abs'를 얻어요. 그런 다음 abs'의 각 arc마다 하나의 부모 arc로 이루어진 경로에 p'을 이어 붙여 결과 경로를 만들어요. 두 경로가 모두 정규이면 결과도 정규가 된다는 점에 유의하세요. relativeTo가 절대 경로가 아니거나, path와 relativeTo가 모두 절대 경로지만 루트가 다르면 Path 예외가 발생해요. 결과 문자열의 크기가 String.maxSize보다 크면 Size 예외가 발생해요. 다음은 Unix 경로에 대한 몇 가지 예시예요: path relativeTo mkRelative{path, relativeTo} "a/b" "/c/d" "a/b" "/" "/a/b/c" "../../.." "/a/b/" "/a/c" "../b/" "/a/b" "/a/c" "../b" "/a/b/" "/a/c/" "../b/" "/a/b" "/a/c/" "../b" "/" "/" "." "/" "/." "." "/" "/.." "." "/a/b/../c" "/a/d" "../b/../c" "/a/b" "/c/d" "../../a/b" "/c/a/b" "/c/d" "../a/b" "/c/d/a/b" "/c/d" "a/b"

isAbsolute path

isRelative path

이 함수들은 path가 각각 절대 또는 상대 경로이면 true를 돌려줘요.

isRoot path

path가 루트 디렉터리의 정규 명세이면 true를 돌려줘요.

concat (path, t)

path 뒤에 t가 이어진 경로를 돌려줘요. t가 상대 경로가 아니거나 path와 t가 서로 다른 볼륨을 가리키면 Path 예외를 발생시켜요. 결과 문자열의 크기가 String.maxSize보다 크면 Size 예외가 발생해요. concat의 구현은 다음과 같을 수 있어요:

fun concat (p1, p2) = (case (fromString p1, fromString p2)
of (_, {isAbs=true, ...}) => raise Path
| ({isAbs, vol=v1, arcs=al1},
{vol=v2, arcs=al2, ...}
) => if ((v2 = "") orelse (v1 = v2))
then toString{
isAbs=isAbs, vol=v1,
arcs=concatArcs(al1, al2)
}
else raise Path
(* end case *))

여기서 concatArcs는 첫 번째 인자의 끝에 있는 빈 arc가 버려진다는 점을 제외하면 List.@와 같아요. concat을 두 문자열의 연결과 혼동해서는 안 된다는 점에 유의하세요. concat은 정규 경로를 보존하지 않아요. 예를 들어 concat("a/b", "../c")는 "a/b/../c"를 돌려줘요. "a/b/../c"와 "a/c"가 심볼릭 링크가 있는 경우 동등하지 않을 수 있으므로 부모 arc는 제거되지 않아요.

fromUnixPath s

Unix 스타일 경로 s를 호스트 운영체제의 경로 구문으로 변환해요. 슬래시 문자와 함께 부모 arc와 현재 arc가 로컬 시스템의 디렉터리 구분자로 변환돼요. Unix 경로의 어떤 arc가 호스트 시스템의 경로 구문에서 유효하지 않으면(예: 호스트 시스템이 Microsoft Windows일 때 arc에 백슬래시 문자가 있는 경우) 이 함수는 InvalidArc 예외를 발생시켜요. Unix 경로명의 구문은 필연적으로 이 함수를 제한한다는 점에 유의하세요. 이 함수로는 비어 있지 않은 볼륨 이름을 가진 경로나 arc 중 하나에 슬래시가 있는 경로를 지정할 수 없어요.

toUnixPath s

호스트 운영체제의 구문인 경로 s를 Unix 스타일 경로로 변환해요. 경로 s에 비어 있지 않은 볼륨 이름이 있으면 Path 예외가 발생해요. 또 경로명의 어떤 arc에 슬래시 문자가 들어 있으면 InvalidArc 예외가 발생해요.## 더 알아보기 (Learn more)