Extracting relative file paths.
getRelative(path, relativeToPath)
makeRelative(files, absoluteBase)
getRelative()
searches path
"from the right" (instead of "from the left")
and tries to reconstruct it relative to directory specified by relativeToPath
.
This is useful when dealing with symlinked paths.
makeRelative()
checks to see if files
and normPath(absoluteBase)
share a common path
(i.e., "from the left"), otherwise it returns files
.
## create a project directory (e.g., on a hard drive)
(tmp1 <- tempdir2("myProject", create = TRUE))
#> [1] "/tmp/RtmpgIZ9bl/reproducible/myProject"
## create a cache directory elsewhere (e.g., on an SSD)
(tmp2 <- tempdir2("my_cache", create = TRUE))
#> [1] "/tmp/RtmpgIZ9bl/reproducible/my_cache"
## symlink the project cache directory to tmp2
## files created here are actually stored in tmp2
prjCache <- file.path(tmp1, "cache")
file.symlink(tmp2, prjCache)
#> [1] TRUE
## create a dummy cache object file in the project cache dir
(tmpf <- tempfile("cache_", prjCache))
#> [1] "/tmp/RtmpgIZ9bl/reproducible/myProject/cache/cache_208ce4eaa61"
cat(rnorm(100), file = tmpf)
file.exists(tmpf)
#> [1] TRUE
normPath(tmpf) ## note the 'real' location (i.e., symlink resolved)
#> [1] "/tmp/RtmpgIZ9bl/reproducible/my_cache/cache_208ce4eaa61"
getRelative(tmpf, prjCache) ## relative path
#> /tmp/RtmpgIZ9bl/reproducible/myProject/cache/cache_208ce4eaa61
#> "cache_208ce4eaa61"
getRelative(tmpf, tmp2) ## relative path
#> /tmp/RtmpgIZ9bl/reproducible/myProject/cache/cache_208ce4eaa61
#> "myProject/cache/cache_208ce4eaa61"
makeRelative(tmpf, tmp2) ## abs path; tmpf and normPath(tmp2) don't share common path
#> [1] "/tmp/RtmpgIZ9bl/reproducible/myProject/cache/cache_208ce4eaa61"
makeRelative(tmpf, prjCache) ## abs path; tmpf and normPath(tmp2) don't share common path
#> [1] "/tmp/RtmpgIZ9bl/reproducible/myProject/cache/cache_208ce4eaa61"
makeRelative(normPath(tmpf), prjCache) ## rel path; share common path when both normPath-ed
#> [1] "cache_208ce4eaa61"
unlink(tmp1, recursive = TRUE)
unlink(tmp2, recursive = TRUE)