Структура File
pub struct File { /* private fields */ }
fs.Ссылка на открытый файл в файловой системе.
Это специализированная версия std::fs::File, предназначенная для использования в среде выполнения Tokio.
Экземпляр File можно читать и/или записывать в зависимости от параметров, с которыми он был открыт. Файлы также реализуют AsyncSeek, чтобы изменять логический курсор, хранящийся внутри файла.
Файл не будет закрыт сразу после выхода из области видимости, если остались незавершённые операции ввода-вывода. Чтобы гарантировать немедленное закрытие файла при его удалении, перед этим следует вызвать flush. Обратите внимание, что это не гарантирует, что файл будет полностью записан на диск: операционная система может хранить изменения в буфере в памяти. См. метод sync_all, который указывает ОС записать данные на диск.
Чтение из File и запись в него обычно выполняются с помощью удобных методов, определённых в трейтах AsyncReadExt и AsyncWriteExt.
Примеры
Создание нового файла и асинхронная запись в него байтов:
use tokio::fs::File;
use tokio::io::AsyncWriteExt; // for write_all()
let mut file = File::create("foo.txt").await?;
file.write_all(b"hello, world!").await?;Чтение содержимого файла в буфер:
use tokio::fs::File;
use tokio::io::AsyncReadExt; // for read_to_end()
let mut file = File::open("foo.txt").await?;
let mut contents = vec![];
file.read_to_end(&mut contents).await?;
println!("len = {}", contents.len());Реализации
impl File
pub async fn open(path: impl AsRef<Path>) -> Result<File>
Пытается открыть файл в режиме только для чтения.
Подробнее см. OpenOptions.
Ошибки
Эта функция вернёт ошибку, если её вызвать вне среды выполнения Tokio или если файл по указанному пути не существует. Также могут быть возвращены другие ошибки в соответствии с OpenOptions::open.
Примеры
use tokio::fs::File;
use tokio::io::AsyncReadExt;
let mut file = File::open("foo.txt").await?;
let mut contents = vec![];
file.read_to_end(&mut contents).await?;
println!("len = {}", contents.len());Метод read_to_end определён в трейте AsyncReadExt.
pub async fn create(path: impl AsRef<Path>) -> Result<File>
Открывает файл в режиме только для записи.
Эта функция создаст файл, если он не существует, и очистит его содержимое, если он существует.
Подробнее см. OpenOptions.
Ошибки
Возвращает ошибку, если вызвана вне среды выполнения Tokio или если вызов create для нижележащего объекта завершается ошибкой.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::create("foo.txt").await?;
file.write_all(b"hello, world!").await?;Метод write_all определён в трейте AsyncWriteExt.
pub async fn create_new<P: AsRef<Path>>(path: P) -> Result<File>
Открывает файл в режиме чтения и записи.
Эта функция создаст файл, если он не существует, или вернёт ошибку, если он существует. Таким образом, при успешном выполнении гарантируется, что возвращённый файл является новым.
Этот параметр удобен тем, что операция атомарна. В противном случае между проверкой существования файла и созданием нового файла его может создать другой процесс (состояние гонки TOCTOU / атака).
Это также можно записать с помощью File::options().read(true).write(true).create_new(true).open(...).
Подробнее см. OpenOptions.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::create_new("foo.txt").await?;
file.write_all(b"hello, world!").await?;Метод write_all определён в трейте AsyncWriteExt.
pub fn options() -> OpenOptions
Возвращает новый объект OpenOptions.
Эта функция возвращает новый объект OpenOptions, который можно использовать для открытия или создания файла с заданными параметрами, если open() или create() не подходят.
Это эквивалентно OpenOptions::new(), но позволяет писать более понятный код. Вместо OpenOptions::new().append(true).open("example.log") можно написать File::options().append(true).open("example.log"). Кроме того, это избавляет от необходимости импортировать OpenOptions.
Подробнее см. функцию OpenOptions::new.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut f = File::options().append(true).open("example.log").await?;
f.write_all(b"new line\n").await?;pub fn from_std(std: StdFile) -> File
Преобразует std::fs::File в tokio::fs::File.
Примеры
// This line could block. It is not recommended to do this on the Tokio
// runtime.
let std_file = std::fs::File::open("foo.txt").unwrap();
let file = tokio::fs::File::from_std(std_file);pub async fn sync_all(&self) -> Result<()>
Пытается синхронизировать все внутренние метаданные ОС с диском.
Эта функция пытается обеспечить запись всех данных, находящихся в памяти, в файловую систему до возврата.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::create("foo.txt").await?;
file.write_all(b"hello, world!").await?;
file.sync_all().await?;Метод write_all определён в трейте AsyncWriteExt.
pub async fn sync_data(&self) -> Result<()>
Эта функция похожа на sync_all, за исключением того, что она может не синхронизировать метаданные файла с файловой системой.
Она предназначена для случаев, когда необходимо синхронизировать содержимое, но метаданные на диске не нужны. Цель этого метода — сократить количество операций с диском.
Обратите внимание, что на некоторых платформах этот метод может быть реализован просто через sync_all.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::create("foo.txt").await?;
file.write_all(b"hello, world!").await?;
file.sync_data().await?;Метод write_all определён в трейте AsyncWriteExt.
pub async fn set_len(&self, size: u64) -> Result<()>
Усекает или расширяет базовый файл, изменяя его размер на size.
Если size меньше текущего размера файла, файл будет уменьшен. Если он больше текущего размера файла, файл будет расширен до size, а все промежуточные данные будут заполнены нулями.
Ошибки
Эта функция вернёт ошибку, если файл не открыт для записи.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::create("foo.txt").await?;
file.write_all(b"hello, world!").await?;
file.set_len(10).await?;Метод write_all определён в трейте AsyncWriteExt.
pub async fn metadata(&self) -> Result<Metadata>
Получает метаданные базового файла.
Примеры
use tokio::fs::File;
let file = File::open("foo.txt").await?;
let metadata = file.metadata().await?;
println!("{:?}", metadata);pub async fn try_clone(&self) -> Result<File>
Создаёт новый экземпляр File, использующий тот же базовый файловый дескриптор, что и существующий экземпляр File. Чтение, запись и перемещение по файлу будут одновременно влиять на оба экземпляра File.
Примеры
use tokio::fs::File;
let file = File::open("foo.txt").await?;
let file_clone = file.try_clone().await?;pub async fn into_std(self) -> StdFile
Преобразует File в std::fs::File. Эта функция является асинхронной, чтобы все выполняющиеся операции могли завершиться.
Чтобы выполнить преобразование немедленно, используйте File::try_into_std.
Примеры
use tokio::fs::File;
let tokio_file = File::open("foo.txt").await?;
let std_file = tokio_file.into_std().await;pub fn try_into_std(self) -> Result<StdFile, Self>
Пытается немедленно преобразовать File в std::fs::File.
Ошибки
Эта функция вернёт ошибку, содержащую файл, если какая-либо операция ещё выполняется.
Примеры
use tokio::fs::File;
let tokio_file = File::open("foo.txt").await?;
let std_file = tokio_file.try_into_std().unwrap();pub async fn set_permissions(&self, perm: Permissions) -> Result<()>
Изменяет права доступа к базовому файлу.
Поведение зависит от платформы
В настоящее время эта функция соответствует функции fchmod в Unix и функции SetFileInformationByHandle в Windows. Обратите внимание, что это может измениться в будущем.
Ошибки
Эта функция вернёт ошибку, если у пользователя недостаточно прав для изменения атрибутов базового файла. Она также может возвращать ошибку в других неуказанных случаях, специфичных для ОС.
Примеры
use tokio::fs::File;
let file = File::open("foo.txt").await?;
let mut perms = file.metadata().await?.permissions();
perms.set_readonly(true);
file.set_permissions(perms).await?;pub fn set_max_buf_size(&mut self, max_buf_size: usize)
Задаёт максимальный размер буфера для операции с базовым AsyncRead / AsyncWrite.
Хотя Tokio использует разумное значение по умолчанию для размера этого буфера, эта функция полезна, когда необходимо изменить значение по умолчанию в зависимости от ситуации.
Примеры
use tokio::fs::File;
use tokio::io::AsyncWriteExt;
let mut file = File::open("foo.txt").await?;
// Set maximum buffer size to 8 MiB
file.set_max_buf_size(8 * 1024 * 1024);
let mut buf = vec![1; 1024 * 1024 * 1024];
// Write the 1 GiB buffer in chunks up to 8 MiB each.
file.write_all(&mut buf).await?;pub fn max_buf_size(&self) -> usize
Возвращает максимальный размер буфера для операции с базовым AsyncRead / AsyncWrite.
Реализации трейтов
impl AsFd for File
fn as_fd(&self) -> BorrowedFd<'_>
impl AsHandle for File
fn as_handle(&self) -> BorrowedHandle<'_>
docsrs и Unix и (функции crate fs или net).impl AsRawHandle for File
fn as_raw_handle(&self) -> RawHandle
docsrs и Unix и (функции crate fs или net).impl AsyncWrite for File
fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, src: &[u8], ) -> Poll<Result<usize>>
buf в объект. Подробнее
fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll<Result<usize, Error>>
poll_write, но запись выполняется из среза буферов. Подробнее
fn is_write_vectored(&self) -> bool
poll_write_vectored. Подробнее
impl From<NotDefinedHere> for File
fn from(handle: OwnedHandle) -> Self
impl FromRawFd for File
unsafe fn from_raw_fd(fd: RawFd) -> Self
Self из указанного необработанного файлового дескриптора. Подробнее
impl FromRawHandle for File
unsafe fn from_raw_handle(handle: RawHandle) -> Self
docsrs и Unix и (функции crate fs или net).Реализации автоматических трейтов
impl !Freeze for File
impl !RefUnwindSafe for File
impl !UnwindSafe for File
impl Send for File
impl Sync for File
impl Unpin for File
impl UnsafeUnpin for File
Общие реализации
impl<R> AsyncReadExt for R
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where Self: Unpin,
io-util.fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
io-util.fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
fn read_u8(&mut self) -> ReadU8<&mut Self>where Self: Unpin,
io-util.fn read_i8(&mut self) -> ReadI8<&mut Self>where Self: Unpin,
io-util.fn read_u16(&mut self) -> ReadU16<&mut Self>where Self: Unpin,
io-util.fn read_i32(&mut self) -> ReadI32<&mut Self>where Self: Unpin,
io-util.fn read_u64(&mut self) -> ReadU64<&mut Self>where Self: Unpin,
io-util.fn read_i64(&mut self) -> ReadI64<&mut Self>where Self: Unpin,
io-util.fn read_u128(&mut self) -> ReadU128<&mut Self>where Self: Unpin,
io-util.fn read_i128(&mut self) -> ReadI128<&mut Self>where Self: Unpin,
io-util.fn read_f32(&mut self) -> ReadF32<&mut Self>where Self: Unpin,
io-util.fn read_f64(&mut self) -> ReadF64<&mut Self>where Self: Unpin,
io-util.fn read_u16_le(&mut self) -> ReadU16Le<&mut Self>where Self: Unpin,
io-util.fn read_i16_le(&mut self) -> ReadI16Le<&mut Self>where Self: Unpin,
io-util.fn read_u32_le(&mut self) -> ReadU32Le<&mut Self>where Self: Unpin,
io-util.fn read_i32_le(&mut self) -> ReadI32Le<&mut Self>where Self: Unpin,
io-util.fn read_u64_le(&mut self) -> ReadU64Le<&mut Self>where Self: Unpin,
io-util.fn read_i64_le(&mut self) -> ReadI64Le<&mut Self>where Self: Unpin,
io-util.fn read_u128_le(&mut self) -> ReadU128Le<&mut Self>where Self: Unpin,
io-util.fn read_i128_le(&mut self) -> ReadI128Le<&mut Self>where Self: Unpin,
io-util.fn read_f32_le(&mut self) -> ReadF32Le<&mut Self>where Self: Unpin,
io-util.fn read_f64_le(&mut self) -> ReadF64Le<&mut Self>where Self: Unpin,
io-util.fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
fn read_to_string<'a>( &'a mut self, dst: &'a mut String, ) -> ReadToString<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
impl<S> AsyncSeekExt for S
fn seek(&mut self, pos: SeekFrom) -> Seek<'_, Self>where Self: Unpin,
io-util.fn rewind(&mut self) -> Seek<'_, Self>where Self: Unpin,
io-util.fn stream_position(&mut self) -> Seek<'_, Self>where Self: Unpin,
io-util.impl<W> AsyncWriteExt for Wwhere W: AsyncWrite + ?Sized,
fn write<'a>(&'a mut self, src: &'a [u8]) -> Write<'a, Self>where Self: Unpin,
io-util.fn write_vectored<'a, 'b>( &'a mut self, bufs: &'a [IoSlice<'b>], ) -> WriteVectored<'a, 'b, Self>where Self: Unpin,
io-util.fn write_buf<'a, B>(&'a mut self, src: &'a mut B) -> WriteBuf<'a, Self, B>
io-util.fn write_all_buf<'a, B>( &'a mut self, src: &'a mut B, ) -> WriteAllBuf<'a, Self, B>
io-util.fn write_all<'a>(&'a mut self, src: &'a [u8]) -> WriteAll<'a, Self>where Self: Unpin,
io-util.fn write_u8(&mut self, n: u8) -> WriteU8<&mut Self>where Self: Unpin,
io-util.fn write_i16(&mut self, n: i16) -> WriteI16<&mut Self>where Self: Unpin,
io-util.fn write_u32(&mut self, n: u32) -> WriteU32<&mut Self>where Self: Unpin,
io-util.fn write_i32(&mut self, n: i32) -> WriteI32<&mut Self>where Self: Unpin,
io-util.fn write_u64(&mut self, n: u64) -> WriteU64<&mut Self>where Self: Unpin,
io-util.fn write_i64(&mut self, n: i64) -> WriteI64<&mut Self>where Self: Unpin,
io-util.fn write_u128(&mut self, n: u128) -> WriteU128<&mut Self>where Self: Unpin,
io-util.fn write_i128(&mut self, n: i128) -> WriteI128<&mut Self>where Self: Unpin,
io-util.fn write_f64(&mut self, n: f64) -> WriteF64<&mut Self>where Self: Unpin,
io-util.fn write_u16_le(&mut self, n: u16) -> WriteU16Le<&mut Self>where Self: Unpin,
io-util.fn write_i16_le(&mut self, n: i16) -> WriteI16Le<&mut Self>where Self: Unpin,
io-util.fn write_u32_le(&mut self, n: u32) -> WriteU32Le<&mut Self>where Self: Unpin,
io-util.fn write_i32_le(&mut self, n: i32) -> WriteI32Le<&mut Self>where Self: Unpin,
io-util.fn write_u64_le(&mut self, n: u64) -> WriteU64Le<&mut Self>where Self: Unpin,
io-util.fn write_i64_le(&mut self, n: i64) -> WriteI64Le<&mut Self>where Self: Unpin,
io-util.fn write_u128_le(&mut self, n: u128) -> WriteU128Le<&mut Self>where Self: Unpin,
io-util.fn write_i128_le(&mut self, n: i128) -> WriteI128Le<&mut Self>where Self: Unpin,
io-util.fn write_f32_le(&mut self, n: f32) -> WriteF32Le<&mut Self>where Self: Unpin,
io-util.fn write_f64_le(&mut self, n: f64) -> WriteF64Le<&mut Self>where Self: Unpin,
io-util.impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу, возвращая обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/fs/struct.File.html