Файловая система
Base.Filesystem.pwdФункция
pwd() -> AbstractString
Получить текущий рабочий каталог.
Примеры
julia> pwd()
"/home/JuliaUser"
julia> cd("/home/JuliaUser/Projects/julia")
julia> pwd()
"/home/JuliaUser/Projects/julia"
исходный код
Base.Filesystem.cdМетод
cd(dir::AbstractString=homedir())
Установить текущий рабочий каталог.
Примеры
julia> cd("/home/JuliaUser/Projects/julia")
julia> pwd()
"/home/JuliaUser/Projects/julia"
julia> cd()
julia> pwd()
"/home/JuliaUser"
исходный код
Base.Filesystem.cdМетод
cd(f::Function, dir::AbstractString=homedir())
Временное изменение текущего рабочего каталога на dir, применение функции f, и возврат в исходный каталог.
Примеры
julia> pwd()
"/home/JuliaUser"
julia> cd(readdir, "/home/JuliaUser/Projects/julia")
34-element Array{String,1}:
".circleci"
".freebsdci.sh"
".git"
".gitattributes"
".github"
⋮
"test"
"ui"
"usr"
"usr-staging"
julia> pwd()
"/home/JuliaUser"
исходный код
Base.Filesystem.readdirФункция
readdir(dir::AbstractString=pwd();
join::Bool = false,
sort::Bool = true,
) -> Vector{String}
Возвращает имена файлов в каталоге dir или в текущем рабочем каталоге, если не указано. Если join равно false, readdir возвращает только имена файлов в каталоге; если join равно true, она возвращает joinpath(dir, name) для каждого name, так что возвращаемые строки являются полными путями. Если нужно получить абсолютные пути, вызовите readdir с абсолютным путём к каталогу и установите join в true.
По умолчанию readdir сортирует список возвращаемых имён. Если вы хотите пропустить сортировку и получить имена в порядке их расположения в файловой системе, используйте readdir(dir, sort=false), чтобы отключить сортировку.
Ключевые аргументы join и sort требуют по крайней мере Julia 1.4.
Примеры
julia> cd("/home/JuliaUser/dev/julia")
julia> readdir()
30-element Array{String,1}:
".appveyor.yml"
".git"
".gitattributes"
⋮
"ui"
"usr"
"usr-staging"
julia> readdir(join=true)
30-element Array{String,1}:
"/home/JuliaUser/dev/julia/.appveyor.yml"
"/home/JuliaUser/dev/julia/.git"
"/home/JuliaUser/dev/julia/.gitattributes"
⋮
"/home/JuliaUser/dev/julia/ui"
"/home/JuliaUser/dev/julia/usr"
"/home/JuliaUser/dev/julia/usr-staging"
julia> readdir("base")
145-element Array{String,1}:
".gitignore"
"Base.jl"
"Enums.jl"
⋮
"version_git.sh"
"views.jl"
"weakkeydict.jl"
julia> readdir("base", join=true)
145-element Array{String,1}:
"base/.gitignore"
"base/Base.jl"
"base/Enums.jl"
⋮
"base/version_git.sh"
"base/views.jl"
"base/weakkeydict.jl"```
julia> readdir(abspath("base"), join=true)
145-element Array{String,1}:
"/home/JuliaUser/dev/julia/base/.gitignore"
"/home/JuliaUser/dev/julia/base/Base.jl"
"/home/JuliaUser/dev/julia/base/Enums.jl"
⋮
"/home/JuliaUser/dev/julia/base/version_git.sh"
"/home/JuliaUser/dev/julia/base/views.jl"
"/home/JuliaUser/dev/julia/base/weakkeydict.jl"
исходный код
Base.Filesystem.walkdirФункция
walkdir(dir; topdown=true, follow_symlinks=false, onerror=throw)
Возвращает итератор, который обходит древовидную структуру каталога. Итератор возвращает кортеж, содержащий (rootpath, dirs, files). Дерево каталогов может быть обходятся сверху вниз или снизу вверх. Если walkdir или stat сталкивается с IOError, по умолчанию ошибка будет переброшена. Обработка ошибок может быть настроена с помощью ключевого аргумента onerror. onerror вызывается с IOError в качестве аргумента.
Примеры
for (root, dirs, files) in walkdir(".")
println("Directories in $root")
for dir in dirs
println(joinpath(root, dir)) # path to directories
end
println("Files in $root")
for file in files
println(joinpath(root, file)) # path to files
end
end
julia> mkpath("my/test/dir");
julia> itr = walkdir("my");
julia> (root, dirs, files) = first(itr)
("my", ["test"], String[])
julia> (root, dirs, files) = first(itr)
("my/test", ["dir"], String[])
julia> (root, dirs, files) = first(itr)
("my/test/dir", String[], String[])
исходный код
Base.Filesystem.mkdirФункция
mkdir(path::AbstractString; mode::Unsigned = 0o777)
Создает новый каталог с именем path и разрешениями mode. По умолчанию mode равно 0o777, изменённое текущей маской создания файла. Эта функция никогда не создает более одного каталога. Если каталог уже существует или некоторые промежуточные каталоги отсутствуют, функция вызывает ошибку. См. mkpath для функции, которая создает все необходимые промежуточные каталоги. Возвращает path.
Примеры
julia> mkdir("testingdir")
"testingdir"
julia> cd("testingdir")
julia> pwd()
"/home/JuliaUser/testingdir"
исходный код
Base.Filesystem.mkpathФункция
mkpath(path::AbstractString; mode::Unsigned = 0o777)
Создает все каталоги в заданном path, с разрешениями mode. По умолчанию mode равно 0o777, изменённое текущей маской создания файла. В отличие от mkdir, mkpath не выдает ошибку, если path (или части его) уже существует. Возвращает path.
Примеры
julia> mkdir("testingdir")
"testingdir"
julia> cd("testingdir")
julia> pwd()
"/home/JuliaUser/testingdir"
julia> mkpath("my/test/dir")
"my/test/dir"
julia> readdir()
1-element Array{String,1}:
"my"
julia> cd("my")
julia> readdir()
1-element Array{String,1}:
"test"
julia> readdir("test")
1-element Array{String,1}:
"dir"
исходный код
Base.Filesystem.symlinkФункция
symlink(target::AbstractString, link::AbstractString; dir_target = false)
Создаёт символическую ссылку на target с именем link.
На Windows символические ссылки должны быть явно объявлены как ссылки на каталог или нет. Если target уже существует, по умолчанию тип link будет автоматически определён. Однако, если target не существует, функция по умолчанию создаёт ссылку на файл, если dir_target не установлено в true. Обратите внимание, что если пользователь задаёт dir_target, но target существует и представляет собой файл, всё равно будет создана ссылка на каталог, но обращение к символической ссылке завершится ошибкой, точно так же, как если бы пользователь создал ссылку на файл (вызвав symlink() с dir_target установленным в false) и пытался обратиться к ней как к каталогу.
Кроме того, есть два способа создания ссылки на Windows: символические ссылки и точки соединения. Точки соединения немного эффективнее, но не поддерживают относительные пути, поэтому, если запрошена относительная ссылка на каталог (как указано isabspath(target) возвращающим false) будет использована символическая ссылка, в противном случае - точка соединения. Лучшей практикой для создания символических ссылок на Windows является их создание только после того, как файлы/каталоги, на которые они ссылаются, уже созданы.
Эта функция генерирует ошибку в операционных системах, не поддерживающих символические ссылки, таких как Windows XP.
Ключевой аргумент dir_target был добавлен в Julia 1.6. До этого символические ссылки на несуществующие пути на Windows всегда были ссылками на файлы, а относительные ссылки на каталоги не поддерживались.
Base.Filesystem.readlinkФункция
readlink(path::AbstractString) -> AbstractString
Возвращает целевое расположение символической ссылки path.
Base.Filesystem.chmodФункция
chmod(path::AbstractString, mode::Integer; recursive::Bool=false)
Изменяет режим разрешений path на mode. В настоящее время поддерживаются только целочисленные значения mode (например, 0o777). Если recursive=true и путь указывают на каталог, все разрешения в этом каталоге будут изменены рекурсивно. Возвращает path.
До Julia 1.6 это некорректно манипулировало ACL системы файлов на Windows, поэтому оно устанавливало только биты "только для чтения" для файлов. Теперь оно способно манипулировать ACL.
Base.Filesystem.chownФункция
chown(path::AbstractString, owner::Integer, group::Integer=-1)
Изменяет владельца и/или группу path на owner и/или group. Если введённое значение для owner или group равно -1, соответствующий идентификатор не изменится. В настоящее время поддерживаются только целочисленные значения owner и group. Возвращает path.
Base.Libc.RawFDТип
RawFD
Примитивный тип, который оборачивает дескриптор файла операционной системы. RawFD можно передавать методам, таким как stat, чтобы получить информацию об исходном файле, а также для открытия потоков, где RawFD описывает файл ОС, на котором основан поток.
Base.statФункция
stat(file)
Возвращает структуру, поля которой содержат информацию о файле. Поля структуры:
| Имя | Описание |
|---|---|
| size | Размер файла (в байтах) |
| device | Идентификатор устройства, содержащего файл |
| inode | Номер inode файла |
| mode | Режим защиты файла |
| nlink | Количество жёстких ссылок на файл |
| uid | Идентификатор пользователя владельца файла |
| gid | Идентификатор группы владельца файла |
| rdev | Если этот файл ссылается на устройство, ID устройства, на которое он ссылается |
| blksize | Предпочитаемый размер блока файловой системы для файла |
| blocks | Количество выделенных блоков |
| mtime | Маркер времени Unix, когда файл был последний раз изменён |
| ctime | Маркер времени Unix, когда файл был создан |
Base.Filesystem.lstatФункция
lstat(file)
Аналогично stat, но для символических ссылок возвращает информацию о самой ссылке, а не о файле, на который она ссылается. Эта функция должна вызываться с путём к файлу, а не с объектом файла или дескриптором файла.
Base.Filesystem.ctimeФункция
ctime(file)
Эквивалентно stat(file).ctime.
Base.Filesystem.mtimeФункция
mtime(file)
Эквивалентно stat(file).mtime.
Base.Filesystem.filemodeФункция
filemode(file)
Эквивалентно stat(file).mode.
Base.filesizeФункция
filesize(path...)
Эквивалентно stat(file).size.
Base.Filesystem.upermФункция
uperm(file)
Получить разрешения владельца файла в виде битовой маски:
| Значение | Описание |
|---|---|
| 01 | Разрешение на выполнение |
| 02 | Разрешение на запись |
| 04 | Разрешение на чтение |
Для разрешённых аргументов см. stat.
Base.Filesystem.gpermФункция
gperm(file)
Аналогично uperm, но получает разрешения группы, владеющей файлом.
Base.Filesystem.opermФункция
operm(file)
Аналогично uperm, но получает разрешения для пользователей, которые не владеют файлом и не являются членами группы, владеющей файлом.
Base.Filesystem.cpФункция
cp(src::AbstractString, dst::AbstractString; force::Bool=false, follow_symlinks::Bool=false)
Копирует файл, ссылку или каталог из src в dst. Сначала удалит существующий dst.
Если follow_symlinks=false, и src является символической ссылкой, dst будет создан как символическая ссылка. Если follow_symlinks=true и src является символической ссылкой, dst будет копией файла или каталога, на который ссылается src. Возвращает dst.
Base.downloadФункция
download(url::AbstractString, [path::AbstractString = tempname()]) -> path
Загружает файл с указанного URL, сохраняя его по пути path, или, если не указано, по временному пути. Возвращает путь загруженного файла.
Начиная с Julia 1.6, эта функция устарела и является всего лишь тонким обёрткой вокруг Downloads.download. В новом коде следует использовать эту функцию напрямую вместо вызова данной.
Base.Filesystem.mvФункция
mv(src::AbstractString, dst::AbstractString; force::Bool=false)
Перемещает файл, ссылку или каталог из src в dst. Сначала удалит существующий dst . Возвращает dst.
Примеры
julia> write("hello.txt", "world");
julia> mv("hello.txt", "goodbye.txt")
"goodbye.txt"
julia> "hello.txt" in readdir()
false
julia> readline("goodbye.txt")
"world"
julia> write("hello.txt", "world2");
julia> mv("hello.txt", "goodbye.txt")
ERROR: ArgumentError: 'goodbye.txt' exists. `force=true` is required to remove 'goodbye.txt' before moving.
Stacktrace:
[1] #checkfor_mv_cp_cptree#10(::Bool, ::Function, ::String, ::String, ::String) at ./file.jl:293
[...]
julia> mv("hello.txt", "goodbye.txt", force=true)
"goodbye.txt"
julia> rm("goodbye.txt");
исходный код
Base.Filesystem.rmФункция
rm(path::AbstractString; force::Bool=false, recursive::Bool=false)
Удаляет файл, ссылку или пустой каталог по указанному пути. Если force=true передаётся, не существующий путь не обрабатывается как ошибка. Если recursive=true передаётся и путь является каталогом, то все его содержимое удаляется рекурсивно.
Примеры
julia> mkpath("my/test/dir");
julia> rm("my", recursive=true)
julia> rm("this_file_does_not_exist", force=true)
julia> rm("this_file_does_not_exist")
ERROR: IOError: unlink("this_file_does_not_exist"): no such file or directory (ENOENT)
Stacktrace:
[...]
исходный код
Base.Filesystem.touchФункция
touch(path::AbstractString)
Обновляет метку времени последнего изменения файла на текущее время.
Если файла нет, создаётся новый.
Возвращает path.
Примеры
julia> write("my_little_file", 2);
julia> mtime("my_little_file")
1.5273815391135583e9
julia> touch("my_little_file");
julia> mtime("my_little_file")
1.527381559163435e9
Мы можем увидеть, что mtime был изменён touch.
Base.Filesystem.tempnameФункция
tempname(parent=tempdir(); cleanup=true) -> String
Генерирует путь к временному файлу. Эта функция только возвращает путь; файл не создаётся. Путь, скорее всего, будет уникальным, но это не гарантируется из-за весьма маловероятной возможности одновременного вызова tempname с генерацией одного и того же имени файла. Имя гарантированно отличается от всех файлов, уже существующих в момент вызова tempname.
Если вызывается без аргументов, временное имя будет абсолютным путём к временному имени в системном временном каталоге, заданном tempdir(). Если указан аргумент каталога parent, временный путь будет находиться в этом каталоге.
Опция cleanup определяет, пытается ли процесс удалить возвращённый путь автоматически при завершении процесса. Обратите внимание, что функция tempname не создаёт никаких файлов или каталогов по возвращённому расположению, поэтому ничего не нужно очищать, если вы не создали файл или каталог там. Если вы это сделали, и clean имеет значение true, он будет удалён при завершении процесса.
Аргументы parent и cleanup были добавлены в 1.4. До Julia 1.4 путь tempname никогда не очищался при завершении процесса.
Это может привести к уязвимостям безопасности, если другой процесс получит то же имя файла и создаст файл до того, как вы сможете. Откройте файл с помощью JL_O_EXCL если это вызывает беспокойство. Также рекомендуется использовать mktemp() вместо этого.
Base.Filesystem.tempdirФункция
tempdir()
Получает путь к временной директории. В Windows, tempdir() использует первую переменную окружения из упорядоченного списка TMP, TEMP, USERPROFILE. На всех остальных операционных системах, tempdir() использует первую переменную окружения из упорядоченного списка TMPDIR, TMP, TEMP, и TEMPDIR. Если ни одна из них не найдена, используется путь "/tmp".
Base.Filesystem.mktempМетод
mktemp(parent=tempdir(); cleanup=true) -> (path, io)
Возвращает (path, io), где path — путь к новому временному файлу в parent и io — открытый объект файла для этого пути. Параметр cleanup управляет автоматическим удалением временного файла при завершении процесса.
Ключевое слово-аргумент cleanup был добавлен в Julia 1.3. Соответственно, начиная с версии 1.3, Julia удаляет временные пути, созданные mktemp, при завершении процесса Julia, если cleanup явно не задан как false.
Base.Filesystem.mktempМетод
mktemp(f::Function, parent=tempdir())
Применяет функцию f к результату mktemp(parent) и удаляет временный файл по завершении.
Base.Filesystem.mktempdirМетод
mktempdir(parent=tempdir(); prefix="jl_", cleanup=true) -> path
Создает временную директорию в директории parent с именем, сконструированным из заданного префикса и случайного суффикса, и возвращает её путь. Кроме того, любые завершающие X символы могут быть заменены случайными символами. Если parent не существует, выбрасывается ошибка. Параметр cleanup управляет автоматическим удалением временной директории при завершении процесса.
Ключевое слово-аргумент prefix был добавлен в Julia 1.2.
Ключевое слово-аргумент cleanup был добавлен в Julia 1.3. Соответственно, начиная с версии 1.3, Julia удаляет временные пути, созданные mktempdir, при завершении процесса Julia, если cleanup явно не задан как false.
Base.Filesystem.mktempdirМетод
mktempdir(f::Function, parent=tempdir(); prefix="jl_")
Применяет функцию f к результату mktempdir(parent; prefix) и удаляет временную директорию со всеми её содержимым по завершении.
Ключевое слово-аргумент prefix был добавлен в Julia 1.2.
Base.Filesystem.isblockdevФункция
isblockdev(path) -> Bool
Возвращает true, если path — это блок-устройство, false в противном случае.
Base.Filesystem.ischardevФункция
ischardev(path) -> Bool
Возвращает true, если path — это символьное устройство, false в противном случае.
Base.Filesystem.isdirФункция
isdir(path) -> Bool
Возвращает true, если path — это директория, false в противном случае.
Примеры
julia> isdir(homedir())
true
julia> isdir("not/a/directory")
false
исходный код
Base.Filesystem.isfifoФункция
isfifo(path) -> Bool
Возвращает true, если path — это FIFO, false в противном случае.
Base.Filesystem.isfileФункция
isfile(path) -> Bool
Возвращает true, если path — это обычный файл, false в противном случае.
Примеры
julia> isfile(homedir())
false
julia> f = open("test_file.txt", "w");
julia> isfile(f)
true
julia> close(f); rm("test_file.txt")
исходный код
Base.Filesystem.islinkФункция
islink(path) -> Bool
Возвращает true, если path — это символическая ссылка, false в противном случае.
Base.Filesystem.ismountФункция
ismount(path) -> Bool
Возвращает true, если path — это точка монтирования, false в противном случае.
Base.Filesystem.ispathФункция
ispath(path) -> Bool
Возвращает true, если в path существует действительный элемент файловой системы, в противном случае возвращает false. Это обобщение isfile, isdir и т. д.
Base.Filesystem.issetgidФункция
issetgid(path) -> Bool
Возвращает true, если у path установлен флаг setgid, false в противном случае.
Base.Filesystem.issetuidФункция
issetuid(path) -> Bool
Возвращает true, если у path установлен флаг setuid, false в противном случае.
Base.Filesystem.issocketФункция
issocket(path) -> Bool
Возвращает true, если path — это сокет, false в противном случае.
Base.Filesystem.isstickyФункция
issticky(path) -> Bool
Возвращает true, если у path установлен флаг sticky, false в противном случае.
Base.Filesystem.homedirФункция
homedir() -> String
Возвращает домашнюю директорию текущего пользователя.
homedir определяет домашнюю директорию с помощью libuv's uv_os_homedir. Подробнее (например, о том, как указать домашнюю директорию через переменные окружения), см. uv_os_homedir документацию.
Base.Filesystem.dirnameФункция
dirname(path::AbstractString) -> AbstractString
Возвращает часть пути, относящуюся к директории. Завершающие символы ('/' или '\') в пути учитываются как часть пути.
Примеры
julia> dirname("/home/myuser")
"/home"
julia> dirname("/home/myuser/")
"/home/myuser"
См. также: basename
Base.Filesystem.basenameФункция
basename(path::AbstractString) -> AbstractString
Получить имя файла из пути.
Эта функция немного отличается от программы Unix basename, где конечные слэши игнорируются, т.е. $ basename /foo/bar/ возвращает bar, в то время как basename в Julia возвращает пустую строку "".
Примеры
julia> basename("/home/myuser/example.jl")
"example.jl"
julia> basename("/home/myuser/")
""
См. также: dirname
Base.Filesystem.isabspathФункция
isabspath(path::AbstractString) -> Bool
Определить, является ли путь абсолютным (начинается с корневой директории).
Примеры
julia> isabspath("/home")
true
julia> isabspath("home")
false
исходный код
Base.Filesystem.isdirpathФункция
isdirpath(path::AbstractString) -> Bool
Определить, ссылается ли путь на директорию (например, заканчивается разделителем путей).
Примеры
julia> isdirpath("/home")
false
julia> isdirpath("/home/")
true
исходный код
Base.Filesystem.joinpathФункция
joinpath(parts::AbstractString...) -> String
Объединить компоненты пути в полный путь. Если некоторый аргумент является абсолютным путем или (в Windows) имеет спецификацию диска, которая не соответствует диску, вычисленному для объединения предыдущих путей, то предыдущие компоненты отбрасываются.
Примечание для Windows, поскольку существует текущая директория для каждого диска, joinpath("c:", "foo") представляет собой путь, относительный к текущей директории на диске «c:», поэтому он равен «c:foo», а не «c:\foo». Кроме того, joinpath обрабатывает это как неабсолютный путь и игнорирует регистр букв диска, поэтому joinpath("C:\A","c:b") = "C:\A\b".
Примеры
julia> joinpath("/home/myuser", "example.jl")
"/home/myuser/example.jl"
исходный код
Base.Filesystem.abspathФункция
abspath(path::AbstractString) -> String
Преобразовать путь в абсолютный путь, добавив текущую директорию при необходимости. Также нормализует путь, как в normpath.
abspath(path::AbstractString, paths::AbstractString...) -> String
Преобразовать набор путей в абсолютный путь, объединив их вместе и добавив текущую директорию при необходимости. Эквивалентно abspath(joinpath(path, paths...)).
Base.Filesystem.normpathФункция
normpath(path::AbstractString) -> String
Нормализовать путь, удалив записи «.» и «..».
Примеры
julia> normpath("/home/myuser/../example.jl")
"/home/example.jl"
исходный кодnormpath(path::AbstractString, paths::AbstractString...) -> String
Преобразовать набор путей в нормализованный путь, объединив их вместе и удалив записи «.» и «..». Эквивалентно normpath(joinpath(path, paths...)).
Base.Filesystem.realpathФункция
realpath(path::AbstractString) -> String
Канонизировать путь, расширяя символические ссылки и удаляя записи «.» и «..». В случае систем файлов с регистронезависимым регистронезависимым файловыми системами (обычно Mac и Windows), возвращается сохраненный регистр пути файловой системы.
(Эта функция вызывает исключение, если path не существует в файловой системе.)
Base.Filesystem.relpathФункция
relpath(path::AbstractString, startpath::AbstractString = ".") -> AbstractString
Возвратить относительный путь к path либо от текущей директории, либо от необязательной начальной директории. Это вычисление пути: доступ к файловой системе не используется для подтверждения существования или природы path или startpath.
В Windows чувствительность к регистру применяется к каждой части пути, кроме букв дисков. Если path и startpath ссылаются на разные диски, возвращается абсолютный путь path.
Base.Filesystem.expanduserФункция
expanduser(path::AbstractString) -> AbstractString
В системах Unix символ тильды в начале пути заменяется домашней директорией текущего пользователя.
исходный код
Base.Filesystem.splitdirФункция
splitdir(path::AbstractString) -> (AbstractString, AbstractString)
Разделить путь на пару имени директории и имени файла.
Примеры
julia> splitdir("/home/myuser")
("/home", "myuser")
исходный код
Base.Filesystem.splitdriveФункция
splitdrive(path::AbstractString) -> (AbstractString, AbstractString)
В Windows разделить путь на букву диска и часть пути. В Unix-системах первый компонент всегда пустая строка.
исходный код
Base.Filesystem.splitextФункция
splitext(path::AbstractString) -> (AbstractString, AbstractString)
Если последний компонент пути содержит точку, разделить путь на всё перед точкой и всё, включая и после точки. В противном случае вернуть пару аргумента без изменений и пустой строки. «splitext» — сокращение от «split extension».
Примеры
julia> splitext("/home/myuser/example.jl")
("/home/myuser/example", ".jl")
julia> splitext("/home/myuser/example")
("/home/myuser/example", "")
исходный код
Base.Filesystem.splitpathФункция
splitpath(path::AbstractString) -> Vector{String}
Разделить путь к файлу на все его компоненты пути. Это противоположно joinpath. Возвращает массив подстрок, по одной для каждой директории или файла в пути, включая корневую директорию, если она присутствует.
Эта функция требует как минимум Julia 1.1.
Примеры
julia> splitpath("/home/myuser/example.jl")
4-element Vector{String}:
"/"
"home"
"myuser"
"example.jl"
исходный код
© 2009–2021 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.6.0/base/file/