Spec-Zone.ru › D

std.file

Утилиты для работы с файлами и сканирования каталогов. Функции в этом модуле обрабатывают файлы как единое целое, например, читают или записывают по одному файлу за раз. Для открытия файлов и работы с ними через дескрипторы обратитесь к модулю std.stdio.

Категория Функции
Общие exists isDir isFile isSymlink rename thisExePath
Каталоги chdir dirEntries getcwd mkdir mkdirRecurse rmdir rmdirRecurse tempDir
Файлы append copy read readText remove slurp write
Символические ссылки symlink readLink
Атрибуты attrIsDir attrIsFile attrIsSymlink getAttributes getLinkAttributes getSize setAttributes
Отметка времени getTimes getTimesWin setTimes timeLastModified timeLastAccessed timeStatusChanged
Прочие DirEntry FileException PreserveAttributes SpanMode getAvailableDiskSpace


См. также:
Официальное руководство по работе с файлами в D, модуль std.stdio для открытия файлов и работы с ними через дескрипторы и модуль std.path для работы со строками путей.
Лицензия:
Лицензия Boost 1.0.
Авторы:
Walter Bright, Andrei Alexandrescu, Jonathan M Davis
Исходный код
std/file.d
class FileException: object.Exception;

Исключение, выбрасываемое при ошибках ввода-вывода файлов.

Примеры:
import std.exception : assertThrown;

assertThrown!FileException("non.existing.file.".readText);
immutable uint errno;

Код ошибки ОС.

pure @safe this(scope const(char)[] name, scope const(char)[] msg, string file = __FILE__, size_t line = __LINE__);

Конструктор, принимающий сообщение об ошибке.

Параметры:
const(char)[] name Имя файла, в котором произошла ошибка.
const(char)[] msg Сообщение, описывающее ошибку.
string file Файл, в котором произошла ошибка.
size_t line Строка, в которой произошла ошибка.
@trusted this(scope const(char)[] name, uint errno = .errno, string file = __FILE__, size_t line = __LINE__);

Конструктор, принимающий номер ошибки (GetLastError в Windows, errno в POSIX).

Параметры:
const(char)[] name Имя файла, в котором произошла ошибка.
uint errno Номер ошибки.
string file Файл, в котором произошла ошибка. По умолчанию __FILE__.
size_t line Строка, в которой произошла ошибка. По умолчанию __LINE__.
void[] read(R)(R name, size_t upTo = size_t.max)
Constraints: if (isInputRange!R && isSomeChar!(ElementEncodingType!R) && !isInfinite!R && !isConvertibleToString!R);

void[] read(R)(auto ref R name, size_t upTo = size_t.max)
Constraints: if (isConvertibleToString!R);

Считывает всё содержимое файла name и возвращает его как массив без типа. Если размер файла больше, чем upTo, считываются только upTo байт.

Параметры:
R name Строка или диапазон символов, представляющий имя файла
size_t upTo если присутствует, максимальное количество байтов для считывания
Возвращает:
Массив считанных байтов без типа.
Выбрасывает:
FileException при ошибке.
Примеры:
import std.utf : byChar;
scope(exit)
{
    assert(exists(deleteme));
    remove(deleteme);
}

std.file.write(deleteme, "1234"); // deleteme is the name of a temporary file
writeln(read(deleteme, 2)); // "12"
writeln(read(deleteme.byChar)); // "1234"
writeln((cast(const(ubyte)[])read(deleteme)).length); // 4
S readText(S = string, R)(auto ref R name)
Constraints: if (isSomeString!S && (isInputRange!R && !isInfinite!R && isSomeChar!(ElementType!R) || is(StringTypeOf!R)));

Считывает и валидирует (используя std.utf.validate) текстовый файл. S может быть массивом любого типа символов. Однако преобразования ширины или порядка байтов не выполняются. Поэтому, если ширина или порядок байтов символов в заданном файле отличаются от ширины или порядка байтов типа элемента S, валидация завершится неудачно.

Параметры:
S тип строки файла
R name строка или диапазон символов, представляющий имя файла
Возвращает:
Массив считанных символов.
Выбрасывает:
FileException если произошла ошибка при чтении файла, std.utf.UTFException при ошибке декодирования UTF.
Примеры:
Чтение файла с текстом UTF-8.
write(deleteme, "abc"); // deleteme is the name of a temporary file
scope(exit) remove(deleteme);
string content = readText(deleteme);
writeln(content); // "abc"
void write(R)(R name, const void[] buffer)
Constraints: if ((isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) || isSomeString!R) && !isConvertibleToString!R);

void write(R)(auto ref R name, const void[] buffer)
Constraints: if (isConvertibleToString!R);

Записать buffer в файл name.

Создаёт файл, если он не существует.

Параметры:
R name строка или диапазон символов, представляющий имя файла
void[] buffer данные, которые должны быть записаны в файл
Выбрасывает:
FileException при ошибке.
См. также:
std.stdio.toFile
Примеры:
scope(exit)
{
    assert(exists(deleteme));
    remove(deleteme);
}

int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
write(deleteme, a); // deleteme is the name of a temporary file
writeln(cast(int[])read(deleteme)); // a
void append(R)(R name, const void[] buffer)
Constraints: if ((isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) || isSomeString!R) && !isConvertibleToString!R);

void append(R)(auto ref R name, const void[] buffer)
Constraints: if (isConvertibleToString!R);

Добавить buffer в файл name.

Создаёт файл, если он не существует.

Параметры:
R name строка или диапазон символов, представляющий имя файла
void[] buffer данные, которые должны быть добавлены в файл
Выбрасывает:
FileException при ошибке.
Примеры:
scope(exit)
{
    assert(exists(deleteme));
    remove(deleteme);
}

int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
write(deleteme, a); // deleteme is the name of a temporary file
int[] b = [ 13, 21 ];
append(deleteme, b);
writeln(cast(int[])read(deleteme)); // a ~ b
void rename(RF, RT)(RF from, RT to)
Constraints: if ((isInputRange!RF && !isInfinite!RF && isSomeChar!(ElementEncodingType!RF) || isSomeString!RF) && !isConvertibleToString!RF && (isInputRange!RT && !isInfinite!RT && isSomeChar!(ElementEncodingType!RT) || isSomeString!RT) && !isConvertibleToString!RT);

void rename(RF, RT)(auto ref RF from, auto ref RT to)
Constraints: if (isConvertibleToString!RF || isConvertibleToString!RT);

Переименовать файл from в to, перемещая его между каталогами при необходимости. Если целевой файл существует, он перезаписывается.

Переименовать файл через разные точки монтирования или диски невозможно. В POSIX операция атомарна. Это означает, что если to уже существует, в ходе операции не будет периода, когда to отсутствует. См. страничку справки по rename для получения дополнительной информации.

Параметры:
RF from строка или диапазон символов, представляющий имя существующего файла
RT to строка или диапазон символов, представляющий имя целевого файла
Выбрасывает:
FileException при ошибке.
Примеры:
auto t1 = deleteme, t2 = deleteme~"2";
scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove();

t1.write("1");
t1.rename(t2);
writeln(t2.readText); // "1"

t1.write("2");
t1.rename(t2);
writeln(t2.readText); // "2"
void remove(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void remove(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Удалить файл name.

Параметры:
R name строка или диапазон символов, представляющий имя файла
Выбрасывает:
FileException при ошибке.
Примеры:
import std.exception : assertThrown;

deleteme.write("Hello");
writeln(deleteme.readText); // "Hello"

deleteme.remove;
assertThrown!FileException(deleteme.readText);
ulong getSize(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

ulong getSize(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Получить размер файла name в байтах.

Параметры:
R name строка или диапазон символов, представляющий имя файла
Возвращает:
Размер файла в байтах.
Выбрасывает:
FileException при ошибке (например, файл не найден).
Примеры:
scope(exit) deleteme.remove;

// create a file of size 1
write(deleteme, "a");
writeln(getSize(deleteme)); // 1

// create a file of size 3
write(deleteme, "abc");
writeln(getSize(deleteme)); // 3
void getTimes(R)(R name, out SysTime accessTime, out SysTime modificationTime)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void getTimes(R)(auto ref R name, out SysTime accessTime, out SysTime modificationTime)
Constraints: if (isConvertibleToString!R);

Получить время доступа и изменения файла или папки name.

Параметры:
R name Имя файла/папки для получения времени.
SysTime accessTime Время последнего доступа к файлу/папке.
SysTime modificationTime Время последнего изменения файла/папки.
Выбрасывает:
FileException при ошибке.
Примеры:
import std.datetime : abs, SysTime;

scope(exit) deleteme.remove;
write(deleteme, "a");

SysTime accessTime, modificationTime;

getTimes(deleteme, accessTime, modificationTime);

import std.datetime : Clock, seconds;
auto currTime = Clock.currTime();
enum leeway = 5.seconds;

auto diffAccess = accessTime - currTime;
auto diffModification = modificationTime - currTime;
assert(abs(diffAccess) <= leeway);
assert(abs(diffModification) <= leeway);
void getTimesWin(R)(R name, out SysTime fileCreationTime, out SysTime fileAccessTime, out SysTime fileModificationTime)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

Эта функция доступна только для Windows.

Получить время создания/доступа/изменения файла name.

Это то же самое, что и getTimes, за исключением того, что она также возвращает время создания файла — что невозможно на POSIX-системах.

Параметры:
R name Имя файла, для которого нужно получить время.
SysTime fileCreationTime Время создания файла.
SysTime fileAccessTime Время последнего доступа к файлу.
SysTime fileModificationTime Время последнего изменения файла.
Исключения:
FileException при ошибке.
void setTimes(R)(R name, SysTime accessTime, SysTime modificationTime)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void setTimes(R)(auto ref R name, SysTime accessTime, SysTime modificationTime)
Constraints: if (isConvertibleToString!R);

Установить время доступа/изменения файла или папки name.

Параметры:
R name Имя файла/папки, для которого нужно установить время.
SysTime accessTime Время последнего доступа к файлу/папке.
SysTime modificationTime Время последнего изменения файла/папки.
Исключения:
FileException при ошибке.
Примеры:
import std.datetime : DateTime, hnsecs, SysTime;

scope(exit) deleteme.remove;
write(deleteme, "a");

SysTime accessTime = SysTime(DateTime(2010, 10, 4, 0, 0, 30));
SysTime modificationTime = SysTime(DateTime(2018, 10, 4, 0, 0, 30));
setTimes(deleteme, accessTime, modificationTime);

SysTime accessTimeResolved, modificationTimeResolved;
getTimes(deleteme, accessTimeResolved, modificationTimeResolved);

writeln(accessTime); // accessTimeResolved
writeln(modificationTime); // modificationTimeResolved
SysTime timeLastModified(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

SysTime timeLastModified(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Возвращает время последнего изменения указанного файла.

Параметры:
R name имя файла для проверки
Возвращает:
Значение типа std.datetime.systime.SysTime.
Исключения:
FileException, если указанный файл не существует.
Примеры:
import std.datetime : abs, DateTime, hnsecs, SysTime;
scope(exit) deleteme.remove;

import std.datetime : Clock, seconds;
auto currTime = Clock.currTime();
enum leeway = 5.seconds;
deleteme.write("bb");
assert(abs(deleteme.timeLastModified - currTime) <= leeway);
SysTime timeLastModified(R)(R name, SysTime returnIfMissing)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R));

Возвращает время последнего изменения заданного файла. Если файла не существует, возвращает returnIfMissing.

Часто используется в инструментах автоматизации сборки, таких как make или ant. Чтобы проверить, нужно ли перестроить файл target из файла source (то есть target старше source или не существует), используйте приведенное ниже сравнение. Код генерирует исключение FileException, если source не существует (как и должно быть). С другой стороны, значение по умолчанию SysTime.min делает несуществующий target казаться бесконечно старым, поэтому тест правильно сигнализирует о необходимости его перестройки.

Параметры:
R name Имя файла, для которого нужно получить время изменения.
SysTime returnIfMissing Время, которое должно быть возвращено, если указанный файл не существует.
Возвращает:
Значение типа std.datetime.systime.SysTime.
Пример
if (source.timeLastModified >= target.timeLastModified(SysTime.min))
{
    // must (re)build
}
else
{
    // target is up-to-date
}
Примеры:
import std.datetime : SysTime;

writeln("file.does.not.exist".timeLastModified(SysTime.min)); // SysTime.min

auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
scope(exit) source.remove, target.remove;

source.write(".");
assert(target.timeLastModified(SysTime.min) < source.timeLastModified);
target.write(".");
assert(target.timeLastModified(SysTime.min) >= source.timeLastModified);
pure nothrow SysTime timeLastModified()(auto ref stat_t statbuf);

Эта функция доступна только для POSIX.

Возвращает время последнего изменения данного файла.

Параметры:
stat_t statbuf Полученный из файла объект stat_t.
pure nothrow SysTime timeLastAccessed()(auto ref stat_t statbuf);

Эта функция доступна только для POSIX.

Возвращает время последнего доступа к указанному файлу.

Параметры:
stat_t statbuf Полученный из файла объект stat_t.
pure nothrow SysTime timeStatusChanged()(auto ref stat_t statbuf);

Эта функция доступна только для POSIX.

Возвращает время последнего изменения статуса файла.

Параметры:
stat_t statbuf Полученный из файла объект stat_t.
bool exists(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

bool exists(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Определяет, существует ли данный файл (или директория).

Параметры:
R name строка или диапазон символов, представляющий имя файла
Возвращает:
true, если указанный файл существует
Примеры:
auto f = deleteme ~ "does.not.exist";
assert(!f.exists);

f.write("hello");
assert(f.exists);

f.remove;
assert(!f.exists);
uint getAttributes(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

uint getAttributes(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Возвращает атрибуты заданного файла.

Обратите внимание, что атрибуты файлов в системах Windows и POSIX совершенно разные. В Windows они соответствуют результату вызова GetFileAttributes, а в POSIX-системах — значению st_mode, которое является частью результата вызова функции stat.

В POSIX-системах, если указанный файл является символической ссылкой, то атрибуты будут атрибутами файла, на который указывает символическая ссылка.

Параметры:
R name Файл, атрибуты которого нужно получить.
Возвращает:
Атрибуты файла в формате uint.
Исключения:
FileException при ошибке.
Примеры:
getAttributes с файлом
import std.exception : assertThrown;

auto f = deleteme ~ "file";
scope(exit) f.remove;

assert(!f.exists);
assertThrown!FileException(f.getAttributes);

f.write(".");
auto attributes = f.getAttributes;
assert(!attributes.attrIsDir);
assert(attributes.attrIsFile);
Примеры:
getAttributes с директорией
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;

assert(!dir.exists);
assertThrown!FileException(dir.getAttributes);

dir.mkdir;
auto attributes = dir.getAttributes;
assert(attributes.attrIsDir);
assert(!attributes.attrIsFile);
uint getLinkAttributes(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

uint getLinkAttributes(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Если данный файл является символической ссылкой, то эта функция возвращает атрибуты самой символической ссылки, а не файла, на который она указывает. Если данный файл не является символической ссылкой, функция возвращает тот же результат, что и getAttributes.

В Windows getLinkAttributes идентична getAttributes. Она существует в Windows, чтобы вы не приходилось обрабатывать символические ссылки с разным кодом для Windows.

Параметры:
R name Файл, атрибуты символической ссылки которого нужно получить.
Возвращает:
атрибуты
Исключения:
FileException при ошибке.
Примеры:
import std.exception : assertThrown;

auto source = deleteme ~ "source";
auto target = deleteme ~ "target";

assert(!source.exists);
assertThrown!FileException(source.getLinkAttributes);

// symlinking isn't available on Windows
version (Posix)
{
    scope(exit) source.remove, target.remove;

    target.write("target");
    target.symlink(source);
    writeln(source.readText); // "target"
    assert(source.isSymlink);
    assert(source.getLinkAttributes.attrIsSymlink);
}
Примеры:
если файл не является символической ссылкой, getLinkAttributes ведет себя как getAttributes
import std.exception : assertThrown;

auto f = deleteme ~ "file";
scope(exit) f.remove;

assert(!f.exists);
assertThrown!FileException(f.getLinkAttributes);

f.write(".");
auto attributes = f.getLinkAttributes;
assert(!attributes.attrIsDir);
assert(attributes.attrIsFile);
Примеры:
если файл не является символической ссылкой, getLinkAttributes ведет себя как getAttributes
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;

assert(!dir.exists);
assertThrown!FileException(dir.getLinkAttributes);

dir.mkdir;
auto attributes = dir.getLinkAttributes;
assert(attributes.attrIsDir);
assert(!attributes.attrIsFile);
void setAttributes(R)(R name, uint attributes)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void setAttributes(R)(auto ref R name, uint attributes)
Constraints: if (isConvertibleToString!R);

Установить атрибуты данного файла.

Например, программно эквивалент Unix's chmod +x name для придания файлу разрешения на выполнение — name.setAttributes(name.getAttributes | octal!700).

Параметры:
R name имя файла
uint attributes атрибуты, которые нужно установить для файла
Исключения:
FileException, если заданный файл не существует.
Примеры:
setAttributes с файлом
import std.exception : assertThrown;
import std.conv : octal;

auto f = deleteme ~ "file";
version (Posix)
{
    scope(exit) f.remove;

    assert(!f.exists);
    assertThrown!FileException(f.setAttributes(octal!777));

    f.write(".");
    auto attributes = f.getAttributes;
    assert(!attributes.attrIsDir);
    assert(attributes.attrIsFile);

    f.setAttributes(octal!777);
    attributes = f.getAttributes;

    writeln((attributes & 1023)); // octal!777
}
Примеры:
setAttributes с директорией
import std.exception : assertThrown;
import std.conv : octal;

auto dir = deleteme ~ "dir";
version (Posix)
{
    scope(exit) dir.rmdir;

    assert(!dir.exists);
    assertThrown!FileException(dir.setAttributes(octal!777));

    dir.mkdir;
    auto attributes = dir.getAttributes;
    assert(attributes.attrIsDir);
    assert(!attributes.attrIsFile);

    dir.setAttributes(octal!777);
    attributes = dir.getAttributes;

    writeln((attributes & 1023)); // octal!777
}
@property bool isDir(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

@property bool isDir(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Возвращает значение true, если заданный файл является директорией.

Параметры:
R name Путь к файлу.
Возвращает:
true, если имя указывает на директорию
Исключения:
FileException если заданный файл не существует.
Примеры:
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;

assert(!dir.exists);
assertThrown!FileException(dir.isDir);

dir.mkdir;
assert(dir.isDir);

f.write(".");
assert(!f.isDir);
pure nothrow @nogc @safe bool attrIsDir(uint attributes);

Возвращает, являются ли предоставленные атрибуты файла атрибутами каталога.

Параметры:
uint attributes Атрибуты файла.
Возвращает:
true, если атрибуты указывают на каталог
Примеры:
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;

assert(!dir.exists);
assertThrown!FileException(dir.getAttributes.attrIsDir);

dir.mkdir;
assert(dir.isDir);
assert(dir.getAttributes.attrIsDir);

f.write(".");
assert(!f.isDir);
assert(!f.getAttributes.attrIsDir);
@property bool isFile(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

@property bool isFile(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Возвращает, является ли указанный файл (или каталог) файлом.

В Windows, если файл не является каталогом, то он является файлом. Таким образом, либо isFile или isDir вернут true для любого заданного файла.

В системах POSIX, если isFile равно true, это указывает, что файл является обычным файлом (например, не блочным и не устройством). Таким образом, в системах POSIX возможно, что как isFile, так и isDir будут false для определённого файла (в этом случае это специальный файл). Вы можете использовать getAttributes, чтобы получить атрибуты и выяснить, какой тип специального файла это, или вы можете использовать DirEntry, чтобы получить его statBuf, который является результатом stat. В любом случае, см. страницу руководства для stat для получения дополнительной информации.

Параметры:
R name Путь к файлу.
Возвращает:
true, если имя указывает на файл
Выбрасывает:
FileException, если указанный файл не существует.
Примеры:
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;

dir.mkdir;
assert(!dir.isFile);

assert(!f.exists);
assertThrown!FileException(f.isFile);

f.write(".");
assert(f.isFile);
pure nothrow @nogc @safe bool attrIsFile(uint attributes);

Возвращает, являются ли предоставленные атрибуты файла атрибутами файла.

В Windows, если файл не является каталогом, он является файлом. Таким образом, либо attrIsFile или attrIsDir вернут true для атрибутов любого данного файла.

В системах POSIX, если attrIsFile равно true, это указывает, что файл является обычным файлом (например, не блочным и не устройством). Таким образом, в системах POSIX возможно, что как attrIsFile, так и attrIsDir будут false для определённого файла (в этом случае это специальный файл). Если файл является специальным файлом, вы можете использовать атрибуты, чтобы проверить, какой тип специального файла это (см. страницу руководства для stat для получения дополнительной информации).

Параметры:
uint attributes Атрибуты файла.
Возвращает:
true, если предоставленные атрибуты файла относятся к файлу
Пример
assert(attrIsFile(getAttributes("/etc/fonts/fonts.conf")));
assert(attrIsFile(getLinkAttributes("/etc/fonts/fonts.conf")));
Примеры:
import std.exception : assertThrown;

auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;

dir.mkdir;
assert(!dir.isFile);
assert(!dir.getAttributes.attrIsFile);

assert(!f.exists);
assertThrown!FileException(f.getAttributes.attrIsFile);

f.write(".");
assert(f.isFile);
assert(f.getAttributes.attrIsFile);
@property bool isSymlink(R)(R name)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

@property bool isSymlink(R)(auto ref R name)
Constraints: if (isConvertibleToString!R);

Возвращает, является ли указанный файл символической ссылкой.

В Windows возвращает true когда файл является либо символической ссылкой, либо точкой соединения.

Параметры:
R name Путь к файлу.
Возвращает:
true, если имя является символической ссылкой
Выбрасывает:
FileException если указанный файл не существует.
Примеры:
import std.exception : assertThrown;

auto source = deleteme ~ "source";
auto target = deleteme ~ "target";

assert(!source.exists);
assertThrown!FileException(source.isSymlink);

// symlinking isn't available on Windows
version (Posix)
{
    scope(exit) source.remove, target.remove;

    target.write("target");
    target.symlink(source);
    writeln(source.readText); // "target"
    assert(source.isSymlink);
    assert(source.getLinkAttributes.attrIsSymlink);
}
pure nothrow @nogc @safe bool attrIsSymlink(uint attributes);

Возвращает, являются ли предоставленные атрибуты файла атрибутами символической ссылки.

В Windows возвращает true когда файл является либо символической ссылкой, либо точкой соединения.

Параметры:
uint attributes Атрибуты файла.
Возвращает:
true, если атрибуты относятся к символической ссылке
Пример
core.sys.posix.unistd.symlink("/etc/fonts/fonts.conf", "/tmp/alink");

assert(!getAttributes("/tmp/alink").isSymlink);
assert(getLinkAttributes("/tmp/alink").isSymlink);
Примеры:
import std.exception : assertThrown;

auto source = deleteme ~ "source";
auto target = deleteme ~ "target";

assert(!source.exists);
assertThrown!FileException(source.getLinkAttributes.attrIsSymlink);

// symlinking isn't available on Windows
version (Posix)
{
    scope(exit) source.remove, target.remove;

    target.write("target");
    target.symlink(source);
    writeln(source.readText); // "target"
    assert(source.isSymlink);
    assert(source.getLinkAttributes.attrIsSymlink);
}
void chdir(R)(R pathname)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void chdir(R)(auto ref R pathname)
Constraints: if (isConvertibleToString!R);

Изменить текущую директорию на pathname. Эквивалентно cd в Windows и POSIX.

Параметры:
R pathname директория, в которую перейти
Выбрасывает:
FileException при ошибке.
Примеры:
import std.algorithm.comparison : equal;
import std.path : buildPath;

auto cwd = getcwd;
auto dir = deleteme ~ "dir";
dir.mkdir;
scope(exit) cwd.chdir, dir.rmdirRecurse;

dir.buildPath("a").write(".");
dir.chdir; // step into dir
"b".write(".");
dirEntries(".", SpanMode.shallow).equal(
    [".".buildPath("b"), ".".buildPath("a")]
);
void mkdir(R)(R pathname)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void mkdir(R)(auto ref R pathname)
Constraints: if (isConvertibleToString!R);

Создать новую директорию pathname.

Параметры:
R pathname путь к создаваемой директории
Выбрасывает:
FileException в POSIX или WindowsException в Windows, если произошла ошибка.
Примеры:
import std.file : mkdir;

auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;

dir.mkdir;
assert(dir.exists);
Примеры:
import std.exception : assertThrown;
assertThrown("a/b/c/d/e".mkdir);
@safe void mkdirRecurse(scope const(char)[] pathname);

Создать директорию и все родительские директории по мере необходимости.

Ничего не делает, если директория, указанная по pathname, уже существует.

Параметры:
const(char)[] pathname полный путь к создаваемой директории
Выбрасывает:
FileException при ошибке.
Примеры:
import std.path : buildPath;

auto dir = deleteme ~ "dir";
scope(exit) dir.rmdirRecurse;

dir.mkdir;
assert(dir.exists);
dir.mkdirRecurse; // does nothing

// creates all parent directories as needed
auto nested = dir.buildPath("a", "b", "c");
nested.mkdirRecurse;
assert(nested.exists);
Примеры:
import std.exception : assertThrown;

scope(exit) deleteme.remove;
deleteme.write("a");

// cannot make directory as it's already a file
assertThrown!FileException(deleteme.mkdirRecurse);
void rmdir(R)(R pathname)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);

void rmdir(R)(auto ref R pathname)
Constraints: if (isConvertibleToString!R);

Удалить директорию pathname.

Параметры:
R pathname Диапазон или строка, определяющая имя директории
Выбрасывает:
FileException при ошибке.
Примеры:
auto dir = deleteme ~ "dir";

dir.mkdir;
assert(dir.exists);
dir.rmdir;
assert(!dir.exists);
void symlink(RO, RL)(RO original, RL link)
Constraints: if ((isInputRange!RO && !isInfinite!RO && isSomeChar!(ElementEncodingType!RO) || isConvertibleToString!RO) && (isInputRange!RL && !isInfinite!RL && isSomeChar!(ElementEncodingType!RL) || isConvertibleToString!RL));

Эта функция только для POSIX.

Создаёт символическую ссылку (symlink).

Параметры:
RO original Файл, на который ведётся ссылка. Это целевой путь, хранящийся в символической ссылке. Относительный путь относится к созданной символической ссылке.
RL link Символическая ссылка, которую нужно создать. Относительный путь относится к текущей рабочей директории.
Выбрасывает:
FileException при ошибке (включая случай, когда символическая ссылка уже существует).
string readLink(R)(R link)
Constraints: if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R) || isConvertibleToString!R);

Эта функция только для POSIX.

Возвращает путь к файлу, на который указывает символическая ссылка. Обратите внимание, что путь может быть либо относительным, либо абсолютным в зависимости от символической ссылки. Если путь является относительным, он относитлся к символической ссылке, а не к текущей рабочей директории.

Выбрасывает:
FileException при ошибке.
@trusted string getcwd();

Получить текущую рабочую директорию.

Выбрасывает:
FileException при ошибке.
Примеры:
auto s = getcwd();
assert(s.length);
@trusted string thisExePath();

Возвращает полный путь текущего исполняемого файла.

Возвращает:
Путь к исполняемому файлу как string.
Выбрасывает:
Exception
Примеры:
import std.path : isAbsolute;
auto path = thisExePath();

assert(path.exists);
assert(path.isAbsolute);
assert(path.isFile);
struct DirEntry;

Информация о файле, аналогичная той, что вы получите из stat в системе POSIX.

@safe this(string path);

Создаёт DirEntry для заданного файла (или каталога).

Параметры:
string path Файл (или каталог), для которого требуется получить DirEntry.
Исключения:
FileException если файла не существует.
const @property @safe string name();

Возвращает путь к файлу, представленному этим DirEntry.

Пример
auto de1 = DirEntry("/etc/fonts/fonts.conf");
assert(de1.name == "/etc/fonts/fonts.conf");

auto de2 = DirEntry("/usr/share/include");
assert(de2.name == "/usr/share/include");
@property @safe bool isDir();

Возвращает значение, указывающее, является ли файл, представленный этим DirEntry, каталогом.

Пример
auto de1 = DirEntry("/etc/fonts/fonts.conf");
assert(!de1.isDir);

auto de2 = DirEntry("/usr/share/include");
assert(de2.isDir);
@property @safe bool isFile();

Возвращает значение, указывающее, является ли файл, представленный этим DirEntry, файлом.

В Windows, если файл не является каталогом, то он является файлом. Поэтому либо isFile или isDir вернёт true.

В системах POSIX, если isFile равно true, это указывает, что файл является обычным файлом (например, не блочным и не устройством). Таким образом, в системах POSIX оба isFile и isDir могут быть false для определённого файла (в этом случае это специальный файл). Вы можете использовать attributes или statBuf для получения дополнительной информации о специальном файле (см. страницу man для команды stat для получения дополнительных сведений).

Пример
auto de1 = DirEntry("/etc/fonts/fonts.conf");
assert(de1.isFile);

auto de2 = DirEntry("/usr/share/include");
assert(!de2.isFile);
@property @safe bool isSymlink();

Возвращает значение, указывающее, является ли файл, представленный этим DirEntry, символической ссылкой.

В Windows вернёт true когда файл является либо символической ссылкой, либо точкой сопряжения.

@property @safe ulong size();

Возвращает размер файла, представленного этим DirEntry в байтах.

const @property @safe SysTime timeCreated();

Эта функция поддерживается только в Windows.

Возвращает время создания файла, представленного этим DirEntry.

@property @safe SysTime timeLastAccessed();

Возвращает время последнего доступа к файлу, представленному этим DirEntry.

Обратите внимание, что многие файловые системы не обновляют время доступа к файлам (обычно по причинам производительности), поэтому есть большая вероятность, что timeLastAccessed вернёт то же значение, что и timeLastModified.

@property @safe SysTime timeLastModified();

Возвращает время последнего изменения файла, представленного этим DirEntry.

const @property @safe SysTime timeStatusChanged();

Эта функция поддерживается только в POSIX.

Возвращает время последнего изменения файла, представленного этим DirEntry (не только содержимого, но и разрешений или владельца).

@property @safe uint attributes();

Возвращает атрибуты файла, представленного этим DirEntry.

Обратите внимание, что атрибуты файлов в Windows и системах POSIX совершенно разные. В Windows они возвращаются функцией GetFileAttributes GetFileAttributes. В системах POSIX — это значение st_mode , которое является частью структуры stat , полученной при вызове stat.

В системах POSIX, если файл, представленный этим DirEntry , является символической ссылкой, то атрибуты — это атрибуты файла, на который указывает символическая ссылка.

@property @safe uint linkAttributes();

В системах POSIX, если файл, представленный этим DirEntry , является символической ссылкой, то linkAttributes — это атрибуты самой символической ссылки. В противном случае linkAttributes идентично attributes.

В Windows linkAttributes идентично attributes. Оно существует в Windows, чтобы не приходилось разрабатывать код, специфичный для Windows, при работе со символическими ссылками.

@property @safe stat_t statBuf();

Эта функция поддерживается только в POSIX.

Структура stat , полученная при вызове stat.

PreserveAttributes preserveAttributesDefault;

По умолчанию равно Yes.preserveAttributes в Windows и противоположному значению во всех остальных платформах.

void copy(RF, RT)(RF from, RT to, PreserveAttributes preserve = preserveAttributesDefault)
Constraints: if (isInputRange!RF && !isInfinite!RF && isSomeChar!(ElementEncodingType!RF) && !isConvertibleToString!RF && isInputRange!RT && !isInfinite!RT && isSomeChar!(ElementEncodingType!RT) && !isConvertibleToString!RT);

void copy(RF, RT)(auto ref RF from, auto ref RT to, PreserveAttributes preserve = preserveAttributesDefault)
Constraints: if (isConvertibleToString!RF || isConvertibleToString!RT);

Копирует файл from в файл to. Временные метки файла сохраняются. Атрибуты файла сохраняются, если preserve равно Yes.preserveAttributes. В Windows поддерживается только Yes.preserveAttributes (по умолчанию в Windows). Если целевой файл существует, он перезаписывается.

Параметры:
RF from строка или диапазон символов, представляющих имя существующего файла
RT to строка или диапазон символов, представляющих имя целевого файла
PreserveAttributes preserve указывает, сохранять ли атрибуты файла
Исключения:
FileException при ошибке.
Примеры:
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
auto targetNonExistent = deleteme ~ "target2";

scope(exit) source.remove, target.remove, targetNonExistent.remove;

source.write("source");
target.write("target");

writeln(target.readText); // "target"

source.copy(target);
writeln(target.readText); // "source"

source.copy(targetNonExistent);
writeln(targetNonExistent.readText); // "source"
@safe void rmdirRecurse(scope const(char)[] pathname);

@safe void rmdirRecurse(ref DirEntry de);

@safe void rmdirRecurse(DirEntry de);

Рекурсивно удаляет каталог и всё его содержимое и подкаталоги.

Параметры:
const(char)[] pathname путь к каталогу, который необходимо полностью удалить
DirEntry de DirEntry для удаления
Исключения:
FileException при возникновении ошибки (включая случай, когда заданный файл не является каталогом).
Примеры:
import std.path : buildPath;

auto dir = deleteme.buildPath("a", "b", "c");

dir.mkdirRecurse;
assert(dir.exists);

deleteme.rmdirRecurse;
assert(!dir.exists);
assert(!deleteme.exists);
enum SpanMode: int;

Определяет политику охватывания каталогов для dirEntries (см. ниже).

Примеры:
import std.algorithm.comparison : equal;
import std.algorithm.iteration : map;
import std.path : buildPath, relativePath;

auto root = deleteme ~ "root";
scope(exit) root.rmdirRecurse;
root.mkdir;

root.buildPath("animals").mkdir;
root.buildPath("animals", "cat").mkdir;
root.buildPath("animals", "dog").mkdir;
root.buildPath("plants").mkdir;

alias removeRoot = (e) => e.relativePath(root);

root.dirEntries(SpanMode.shallow).map!removeRoot.equal(
    ["plants", "animals"]);

root.dirEntries(SpanMode.depth).map!removeRoot.equal(
    ["plants", "animals/dog", "animals/cat", "animals"]);

root.dirEntries(SpanMode.breadth).map!removeRoot.equal(
    ["plants", "animals", "animals/dog", "animals/cat"]);
shallow

Охватывает только один каталог.

depth

Охватывает каталог в порядке обхода в глубину (post-обход), т.е. содержимое любого подкаталога охватывается до самого подкаталога. Полезно, например, при рекурсивном удалении файлов.

breadth

Охватывает каталог в порядке обхода в глубину (pre-обход), т.е. содержимое любого подкаталога охватывается сразу после самого подкаталога.

Обратите внимание, что SpanMode.breadth не приведет к тому, что все элементы каталога появятся до элементов любого подкаталога, т.е. это не является истинным обходом в ширину.

auto dirEntries(string path, SpanMode mode, bool followSymlink = true);

auto dirEntries(string path, string pattern, SpanMode mode, bool followSymlink = true);

Возвращает входной диапазон диапазон входных значений DirEntry, который лениво итерирует заданный каталог, а также предоставляет два способа итерации foreach. Переменная итерации может быть типа string , если требуется только имя, или DirEntry , если нужны дополнительные детали. Режим обхода определяет, как обрабатывается каталог. Имя каждого итерируемого элемента каталога содержит абсолютный или относительный путь (в зависимости от имени файла).

Параметры:
строка path Каталог для итерации. Если пусто, будет итерироваться текущий каталог.
строка pattern Необязательная строка с масками, например "*.d". Если присутствует, используется для фильтрации результатов по имени файла. Поддерживаемые строки с масками описаны в std.path.globMatch.
SpanMode mode Определяет, должны ли подкаталоги каталога итерироваться в постфиксном порядке обхода в глубину (depth), префиксном порядке обхода в глубину (breadth) или вообще не итерироваться (shallow).
логическое значение followSymlink Указывает, следует ли рассматривать символические ссылки, указывающие на каталоги, как каталоги и итерировать их содержимое.
Возвращает:
Диапазон входных данных типа DirEntry.
Выбрасывает:
FileException, если каталог не существует.
Пример
// Iterate a directory in depth
foreach (string name; dirEntries("destroy/me", SpanMode.depth))
{
    remove(name);
}

// Iterate the current directory in breadth
foreach (string name; dirEntries("", SpanMode.breadth))
{
    writeln(name);
}

// Iterate a directory and get detailed info about it
foreach (DirEntry e; dirEntries("dmd-testing", SpanMode.breadth))
{
    writeln(e.name, "\t", e.size);
}

// Iterate over all *.d files in current directory and all its subdirectories
auto dFiles = dirEntries("", SpanMode.depth).filter!(f => f.name.endsWith(".d"));
foreach (d; dFiles)
    writeln(d.name);

// Hook it up with std.parallelism to compile them all in parallel:
foreach (d; parallel(dFiles, 1)) //passes by 1 file to each thread
{
    string cmd = "dmd -c "  ~ d.name;
    writeln(cmd);
    std.process.executeShell(cmd);
}

// Iterate over all D source files in current directory and all its
// subdirectories
auto dFiles = dirEntries("","*.{d,di}",SpanMode.depth);
foreach (d; dFiles)
    writeln(d.name);
Примеры:
Дублирование функциональности D1's std.file.listdir():
string[] listdir(string pathname)
{
    import std.algorithm;
    import std.array;
    import std.file;
    import std.path;

    return std.file.dirEntries(pathname, SpanMode.shallow)
        .filter!(a => a.isFile)
        .map!(a => std.path.baseName(a.name))
        .array;
}

void main(string[] args)
{
    import std.stdio;

    string[] files = listdir(args[1]);
    writefln("%s", files);
 }
Select!(Types.length == 1, Types[0][], Tuple!Types[]) slurp(Types...)(string filename, scope const(char)[] format);

Читает файл построчно и парсит каждую строку в одно значение или в std.typecons.Tuple значений в зависимости от длины Types. Строки парсятся с использованием указанной строки формата. Строка формата передаётся в std.format.formattedRead и поэтому должна соответствовать спецификации формата, описанной в std.format.

Параметры:
Types типы, в которые должны быть возвращены элементы каждой строки
строка filename имя файла для чтения
const(char)[] format строка формата, используемая при чтении
Возвращает:
Если передаётся только один тип, возвращается массив этого типа. В противном случае возвращается массив std.typecons.Tuple значений.
Выбрасывает:
Exception если строка формата имеет неправильный формат. Также выбрасывает Exception , если какие-либо строки файла не полностью потребляются при вызове std.format.formattedRead. Это означает, что не допускаются пустые строки или строки с дополнительными символами.
Примеры:
import std.typecons : tuple;

scope(exit)
{
    assert(exists(deleteme));
    remove(deleteme);
}

write(deleteme, "12 12.25\n345 1.125"); // deleteme is the name of a temporary file

// Load file; each line is an int followed by comma, whitespace and a
// double.
auto a = slurp!(int, double)(deleteme, "%s %s");
writeln(a.length); // 2
writeln(a[0]); // tuple(12, 12.25)
writeln(a[1]); // tuple(345, 1.125)
@trusted string tempDir();

Возвращает путь к каталогу для временных файлов.

Результат работы функции кэшируется, поэтому описанные ниже процедуры будут выполнены только при первом вызове функции. Все последующие вызовы вернут ту же строку, независимо от того, изменились ли переменные среды и структура каталогов.

Алгоритм POSIX tempDir вдохновлён функцией Python's tempfile.tempdir.

Возвращает:
В Windows эта функция возвращает результат вызова функции Windows API GetTempPath. На платформах POSIX она перебирает следующий список каталогов и возвращает первый, который существует:
  1. Каталог, заданный переменной среды TMPDIR.
  2. Каталог, заданный переменной среды TEMP.
  3. Каталог, заданный переменной среды TMP.
  4. /tmp
  5. /var/tmp
  6. /usr/tmp
Во всех платформах в случае неудачи tempDir возвращает "." , представляющую текущий рабочий каталог.
Примеры:
import std.ascii : letters;
import std.conv : to;
import std.path : buildPath;
import std.random : randomSample;
import std.utf : byCodeUnit;

// random id with 20 letters
auto id = letters.byCodeUnit.randomSample(20).to!string;
auto myFile = tempDir.buildPath(id ~ "my_tmp_file");
scope(exit) myFile.remove;

myFile.write("hello");
writeln(myFile.readText); // "hello"
@safe ulong getAvailableDiskSpace(scope const(char)[] path);

Возвращает доступное дисковое пространство на основе заданного пути. В Windows path должен быть каталогом; в системах POSIX это может быть файл или каталог.

Параметры:
const(char)[] path в Windows должен быть каталогом, в POSIX может быть файлом или каталогом
Возвращает:
Доступное пространство в байтах
Выбрасывает:
FileException в случае неудачи
Примеры:
import std.exception : assertThrown;

auto space = getAvailableDiskSpace(".");
assert(space > 0);

assertThrown!FileException(getAvailableDiskSpace("ThisFileDoesNotExist123123"));

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_file.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API