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 они возвращаются функцией
GetFileAttributesGetFileAttributes. В системах 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 deDirEntryдля удаления
- Исключения:
-
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();
-
Возвращает путь к каталогу для временных файлов.
Результат работы функции кэшируется, поэтому описанные ниже процедуры будут выполнены только при первом вызове функции. Все последующие вызовы вернут ту же строку, независимо от того, изменились ли переменные среды и структура каталогов.
Алгоритм POSIXtempDirвдохновлён функцией Python'stempfile.tempdir.- Возвращает:
- В Windows эта функция возвращает результат вызова функции Windows API
GetTempPath. На платформах POSIX она перебирает следующий список каталогов и возвращает первый, который существует:- Каталог, заданный переменной среды
TMPDIR. - Каталог, заданный переменной среды
TEMP. - Каталог, заданный переменной среды
TMP. /tmp/var/tmp/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