pub struct File { /* private fields */ }
Expand description
提供对文件系统上打开文件的访问权限的对象。
可以通过打开 File
的选项来读取或者写入 File
的实例。文件还实现 Seek
,以更改文件内部包含的逻辑游标。
文件离开作用域时将自动关闭。Drop
的实现将忽略在关闭时检测到的错误。如果必须手动处理这些错误,请使用方法 sync_all
。
Examples
创建一个新文件并向其写入字节 (您也可以使用 write()
) :
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let mut file = File::create("foo.txt")?;
file.write_all(b"Hello, world!")?;
Ok(())
}
Runuse std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let mut file = File::open("foo.txt")?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
assert_eq!(contents, "Hello, world!");
Ok(())
}
Run使用缓冲的 Read
来读取文件的内容可能会更有效。这可以用 BufReader<R>
完成:
use std::fs::File;
use std::io::BufReader;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let file = File::open("foo.txt")?;
let mut buf_reader = BufReader::new(file);
let mut contents = String::new();
buf_reader.read_to_string(&mut contents)?;
assert_eq!(contents, "Hello, world!");
Ok(())
}
Run请注意,虽然读写方法需要一个 &mut File
,但由于 Read
和 Write
的接口,&File
的持有者仍然可以修改文件,可以通过采用 &File
的方法,也可以通过检索底层操作系统对象并以这种方式修改文件。
另外,许多操作系统允许通过不同的进程并发修改文件。避免假定持有 &File
意味着文件不会更改。
特定于平台的行为
在 Windows 上,File
的 Read
和 Write
traits 的实现执行同步的 I/O 操作。因此,必须没有为异步 I/O 打开底层文件 (例如使用 FILE_FLAG_OVERLAPPED
)。
Implementations§
source§impl File
impl File
sourcepub fn open<P: AsRef<Path>>(path: P) -> Result<File>
pub fn open<P: AsRef<Path>>(path: P) -> Result<File>
尝试以只读模式打开文件。
有关更多详细信息,请参见 OpenOptions::open
方法。
如果您只需要读取整个文件内容,请考虑使用 std::fs::read()
或 std::fs::read_to_string()
。
Errors
如果 path
还不存在,则此函数将返回错误。
根据 OpenOptions::open
,可能还会返回其他错误。
Examples
use std::fs::File;
use std::io::Read;
fn main() -> std::io::Result<()> {
let mut f = File::open("foo.txt")?;
let mut data = vec![];
f.read_to_end(&mut data)?;
Ok(())
}
Runsourcepub fn create<P: AsRef<Path>>(path: P) -> Result<File>
pub fn create<P: AsRef<Path>>(path: P) -> Result<File>
以只写模式打开文件。
如果该函数不存在,则此函数将创建一个文件,如果存在则将截断该文件。
根据平台,如果完整目录路径不存在,此函数可能会失败。
有关更多详细信息,请参见 OpenOptions::open
函数。
另请参见 std::fs::write()
,了解使用给定数据创建文件的简单函数。
Examples
use std::fs::File;
use std::io::Write;
fn main() -> std::io::Result<()> {
let mut f = File::create("foo.txt")?;
f.write_all(&1234_u32.to_be_bytes())?;
Ok(())
}
Runsourcepub fn create_new<P: AsRef<Path>>(path: P) -> Result<File>
🔬This is a nightly-only experimental API. (file_create_new
#105135)
pub fn create_new<P: AsRef<Path>>(path: P) -> Result<File>
file_create_new
#105135)以读写模式创建一个新文件; 如果文件存在则出错。
如果文件不存在,此函数将创建一个文件,如果存在则返回错误。 这样,如果调用成功,则保证返回的文件是新的。
此选项很有用,因为它是原子的。 否则,在检查文件是否存在与创建新文件之间,文件可能是由另一个进程创建的 (TOCTOU 竞态条件 / 攻击)。
这也可以使用 File::options().read(true).write(true).create_new(true).open(...)
编写。
Examples
#![feature(file_create_new)]
use std::fs::File;
use std::io::Write;
fn main() -> std::io::Result<()> {
let mut f = File::create_new("foo.txt")?;
f.write_all("Hello, world!".as_bytes())?;
Ok(())
}
Run1.58.0 · sourcepub fn options() -> OpenOptions
pub fn options() -> OpenOptions
返回一个新的 OpenOptions 对象。
如果不适合使用 open()
或 create()
,则此函数返回一个新的 OpenOptions 对象,可用于打开或创建具有特定选项的文件。
它相当于 OpenOptions::new()
,但允许您编写更具可读性的代码。
您可以写 File::options().append(true).open("example.log")
,而不是 OpenOptions::new().append(true).open("example.log")
。
这也避免了导入 OpenOptions
的需要。
有关更多详细信息,请参见 OpenOptions::new
函数。
Examples
use std::fs::File;
use std::io::Write;
fn main() -> std::io::Result<()> {
let mut f = File::options().append(true).open("example.log")?;
writeln!(&mut f, "new line")?;
Ok(())
}
Runsourcepub fn sync_data(&self) -> Result<()>
pub fn sync_data(&self) -> Result<()>
该函数与 sync_all
类似,不同之处在于它可能不会将文件元数据同步到文件系统。
这适用于必须同步内容但不需要磁盘上元数据的用例。 此方法的目标是减少磁盘操作。
请注意,某些平台可能只是根据 sync_all
来实现此目的。
Examples
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let mut f = File::create("foo.txt")?;
f.write_all(b"Hello, world!")?;
f.sync_data()?;
Ok(())
}
Runsourcepub fn set_len(&self, size: u64) -> Result<()>
pub fn set_len(&self, size: u64) -> Result<()>
截断或扩展底层文件,将此文件的大小更新为 size
。
如果 size
小于当前文件的大小,则文件将被缩小。
如果它大于当前文件的大小,则文件将扩展到 size
,并且所有中间数据都用 0 填充。
文件的游标未更改。特别是,如果游标位于末尾,并且使用此操作将文件缩小了,那么游标现在将超过末尾。
Errors
如果未打开文件进行写入,则此函数将返回错误。
此外,如果由于实现细节所需的长度会导致溢出,则将返回 std::io::ErrorKind::InvalidInput
。
Examples
use std::fs::File;
fn main() -> std::io::Result<()> {
let mut f = File::create("foo.txt")?;
f.set_len(10)?;
Ok(())
}
Run请注意,即使使用 &self
而不是 &mut self
,此方法也会更改底层文件的内容。
1.9.0 · sourcepub fn try_clone(&self) -> Result<File>
pub fn try_clone(&self) -> Result<File>
创建一个新的 File
实例,该实例与现有 File
实例共享相同的底层文件句柄。
读取,写入和查找将同时影响两个 File
实例。
Examples
为名为 foo.txt
的文件创建两个句柄:
use std::fs::File;
fn main() -> std::io::Result<()> {
let mut file = File::open("foo.txt")?;
let file_copy = file.try_clone()?;
Ok(())
}
Run假设有一个名为 foo.txt
的文件,其内容为 abcdef\n
,创建两个句柄,查找其中一个,然后从另一个句柄读取剩余的字节:
use std::fs::File;
use std::io::SeekFrom;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let mut file = File::open("foo.txt")?;
let mut file_copy = file.try_clone()?;
file.seek(SeekFrom::Start(3))?;
let mut contents = vec![];
file_copy.read_to_end(&mut contents)?;
assert_eq!(contents, b"def\n");
Ok(())
}
Run1.16.0 · sourcepub fn set_permissions(&self, perm: Permissions) -> Result<()>
pub fn set_permissions(&self, perm: Permissions) -> Result<()>
更改底层文件的权限。
特定于平台的行为
该函数当前对应于 Unix 上的 fchmod
函数和 Windows 上的 SetFileInformationByHandle
函数。
注意,这个 将来可能会改变。
Errors
如果用户缺少底层文件的权限更改属性,则此函数将返回错误。 在其他特定于操作系统的未指定情况下,它也可能返回错误。
Examples
fn main() -> std::io::Result<()> {
use std::fs::File;
let file = File::open("foo.txt")?;
let mut perms = file.metadata()?.permissions();
perms.set_readonly(true);
file.set_permissions(perms)?;
Ok(())
}
Run请注意,即使使用 &self
而不是 &mut self
,此方法也会更改底层文件的权限。
sourcepub fn set_times(&self, times: FileTimes) -> Result<()>
🔬This is a nightly-only experimental API. (file_set_times
#98245)
pub fn set_times(&self, times: FileTimes) -> Result<()>
file_set_times
#98245)更改底层文件的时间戳。
特定于平台的行为
该函数目前对应于 Unix 上的 futimens
函数 (在 10.13 之前回退到 macOS 上的 futimes
) 和 Windows 上的 SetFileTime
函数。
注意这个 将来可能会发生变化。
Errors
如果用户没有更改底层文件时间戳的权限,此函数将返回错误。 在其他特定于操作系统的未指定情况下,它也可能返回错误。
如果操作系统不支持更改 FileTimes
结构体中设置的一个或多个时间戳,则此函数可能会返回错误。
Examples
#![feature(file_set_times)]
fn main() -> std::io::Result<()> {
use std::fs::{self, File, FileTimes};
let src = fs::metadata("src")?;
let dest = File::options().write(true).open("dest")?;
let times = FileTimes::new()
.set_accessed(src.accessed()?)
.set_modified(src.modified()?);
dest.set_times(times)?;
Ok(())
}
Runsourcepub fn set_modified(&self, time: SystemTime) -> Result<()>
🔬This is a nightly-only experimental API. (file_set_times
#98245)
pub fn set_modified(&self, time: SystemTime) -> Result<()>
file_set_times
#98245)更改底层文件的修改时间。
这是 set_times(FileTimes::new().set_modified(time))
的别名。
Trait Implementations§
1.63.0 · source§impl AsHandle for File
Available on Windows only.
impl AsHandle for File
source§fn as_handle(&self) -> BorrowedHandle<'_>
fn as_handle(&self) -> BorrowedHandle<'_>
source§impl AsRawHandle for File
Available on Windows only.
impl AsRawHandle for File
source§fn as_raw_handle(&self) -> RawHandle
fn as_raw_handle(&self) -> RawHandle
source§impl FileExt for File
Available on WASI only.
impl FileExt for File
source§fn read_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<usize>
fn read_vectored_at( &self, bufs: &mut [IoSliceMut<'_>], offset: u64 ) -> Result<usize>
wasi_ext
#71213)source§fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> Result<usize>
fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> Result<usize>
wasi_ext
#71213)source§fn tell(&self) -> Result<u64>
fn tell(&self) -> Result<u64>
wasi_ext
#71213)source§fn fdstat_set_flags(&self, flags: u16) -> Result<()>
fn fdstat_set_flags(&self, flags: u16) -> Result<()>
wasi_ext
#71213)source§fn fdstat_set_rights(&self, rights: u64, inheriting: u64) -> Result<()>
fn fdstat_set_rights(&self, rights: u64, inheriting: u64) -> Result<()>
wasi_ext
#71213)source§fn advise(&self, offset: u64, len: u64, advice: u8) -> Result<()>
fn advise(&self, offset: u64, len: u64, advice: u8) -> Result<()>
wasi_ext
#71213)source§fn allocate(&self, offset: u64, len: u64) -> Result<()>
fn allocate(&self, offset: u64, len: u64) -> Result<()>
wasi_ext
#71213)source§fn create_directory<P: AsRef<Path>>(&self, dir: P) -> Result<()>
fn create_directory<P: AsRef<Path>>(&self, dir: P) -> Result<()>
wasi_ext
#71213)source§fn read_link<P: AsRef<Path>>(&self, path: P) -> Result<PathBuf>
fn read_link<P: AsRef<Path>>(&self, path: P) -> Result<PathBuf>
wasi_ext
#71213)source§fn metadata_at<P: AsRef<Path>>(
&self,
lookup_flags: u32,
path: P
) -> Result<Metadata>
fn metadata_at<P: AsRef<Path>>( &self, lookup_flags: u32, path: P ) -> Result<Metadata>
wasi_ext
#71213)source§fn remove_file<P: AsRef<Path>>(&self, path: P) -> Result<()>
fn remove_file<P: AsRef<Path>>(&self, path: P) -> Result<()>
wasi_ext
#71213)source§fn remove_directory<P: AsRef<Path>>(&self, path: P) -> Result<()>
fn remove_directory<P: AsRef<Path>>(&self, path: P) -> Result<()>
wasi_ext
#71213)source§fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize>
fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize>
wasi_ext
#71213)1.33.0 · source§fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<()>
fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<()>
buf
所需的确切字节数。 Read more1.15.0 · source§impl FileExt for File
Available on Unix only.
impl FileExt for File
source§fn read_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<usize>
fn read_vectored_at( &self, bufs: &mut [IoSliceMut<'_>], offset: u64 ) -> Result<usize>
unix_file_vectored_at
#89517)read_at
类似,只是它读入一片缓冲区。 Read moresource§fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> Result<usize>
fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> Result<usize>
unix_file_vectored_at
#89517)write_at
类似,只是它从缓冲区的一片中写入。 Read more1.63.0 · source§impl From<File> for OwnedHandle
Available on Windows only.
impl From<File> for OwnedHandle
source§fn from(file: File) -> OwnedHandle
fn from(file: File) -> OwnedHandle
1.20.0 · source§impl From<File> for Stdio
impl From<File> for Stdio
source§fn from(file: File) -> Stdio
fn from(file: File) -> Stdio
Examples
File
将在引擎盖下使用 Stdio::from
转换为 Stdio
。
use std::fs::File;
use std::process::Command;
// 使用包含 "Hello, world!" 的 `foo.txt` 文件
let file = File::open("foo.txt").unwrap();
let reverse = Command::new("rev")
.stdin(file) // 隐式文件转换为 Stdio
.output()
.expect("failed reverse command");
assert_eq!(reverse.stdout, b"!dlrow ,olleH");
Run1.63.0 · source§impl From<OwnedHandle> for File
Available on Windows only.
impl From<OwnedHandle> for File
source§fn from(owned: OwnedHandle) -> Self
fn from(owned: OwnedHandle) -> Self
1.1.0 · source§impl FromRawHandle for File
Available on Windows only.
impl FromRawHandle for File
1.4.0 · source§impl IntoRawFd for File
impl IntoRawFd for File
source§fn into_raw_fd(self) -> RawFd
fn into_raw_fd(self) -> RawFd
1.4.0 · source§impl IntoRawHandle for File
Available on Windows only.
impl IntoRawHandle for File
source§fn into_raw_handle(self) -> RawHandle
fn into_raw_handle(self) -> RawHandle
1.70.0 · source§impl IsTerminal for File
impl IsTerminal for File
source§fn is_terminal(&self) -> bool
fn is_terminal(&self) -> bool
true
。 Read moresource§impl Read for &File
impl Read for &File
source§fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
read_buf
#78485)source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
read
相似,不同之处在于它读入缓冲区的一部分。 Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
#69941)source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf
。 Read moresource§fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
buf
。 Read moresource§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
read_buf
#78485)cursor
所需的确切字节数。 Read moresource§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere Self: Sized,
Read
实例创建一个 “by reference” 适配器。 Read moresource§impl Read for File
impl Read for File
source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
read
相似,不同之处在于它读入缓冲区的一部分。 Read moresource§fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
read_buf
#78485)source§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
#69941)source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf
。 Read moresource§fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
buf
。 Read moresource§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()>
read_buf
#78485)cursor
所需的确切字节数。 Read moresource§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere Self: Sized,
Read
实例创建一个 “by reference” 适配器。 Read moresource§impl Seek for &File
impl Seek for &File
source§impl Seek for File
impl Seek for File
source§impl Write for &File
impl Write for &File
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
#69941)source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
write_all_vectored
#70436)source§impl Write for File
impl Write for File
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
#69941)source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
write_all_vectored
#70436)