pub struct DiskMmapFileMut { /* private fields */ }sync only.Expand description
DiskMmapFile contains a mutable mmap buffer and a writable file.
Implementations§
Source§impl DiskMmapFileMut
impl DiskMmapFileMut
Sourcepub fn create<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn create<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Create a new file and mmap this file
§Notes
The new file is zero size, so before do write, you should truncate first.
Or you can use create_with_options and set max_size field for Options to enable directly write
without truncating.
§Examples
use fmmap::MmapFileMutExt;
use fmmap::raw::DiskMmapFileMut;
let mut file = DiskMmapFileMut::create("disk_create_test.txt").unwrap();
file.truncate(100);
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();Sourcepub fn create_with_options<P: AsRef<Path>>(
path: P,
opts: Options,
) -> Result<Self, Error>
pub fn create_with_options<P: AsRef<Path>>( path: P, opts: Options, ) -> Result<Self, Error>
Create a new file and mmap this file with Options
§Examples
use fmmap::{Options, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
let opts = Options::new()
// truncate to 100
.max_size(100);
let mut file = DiskMmapFileMut::create_with_options("disk_create_with_options_test.txt", opts).unwrap();
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();Sourcepub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Open or Create(if not exists) a file and mmap this file.
§Notes
If the file does not exist, then the new file will be open in zero size, so before do write, you should truncate first.
Or you can use open_with_options and set max_size field for Options to enable directly write
without truncating.
§Examples
File already exists
use fmmap::{MmapFileExt, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Write};
// open and mmap the file
let mut file = DiskMmapFileMut::open("disk_open_test.txt").unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate("some modified data...".len() as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_test.txt").unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());File does not exists
use fmmap::{MmapFileExt, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Write};
// create and mmap the file
let mut file = DiskMmapFileMut::open("disk_open_test.txt").unwrap();
file.truncate(100).unwrap();
file.write_all("some data...".as_bytes(), 0).unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate("some modified data...".len() as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_test.txt").unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());Sourcepub fn open_with_options<P: AsRef<Path>>(
path: P,
opts: Options,
) -> Result<Self, Error>
pub fn open_with_options<P: AsRef<Path>>( path: P, opts: Options, ) -> Result<Self, Error>
Open or Create(if not exists) a file and mmap this file with Options.
§Examples
File already exists
use fmmap::{MmapFileExt, MmapFileMutExt, Options};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Seek, SeekFrom, Write};
// mmap the file with options
let opts = Options::new()
// allow read
.read(true)
// allow write
.write(true)
// allow append
.append(true)
// truncate to 100
.max_size(100)
// mmap content after the sanity text
.offset("sanity text".as_bytes().len() as u64);
let mut file = DiskMmapFileMut::open_with_options("disk_open_test_with_options.txt", opts).unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate(("some modified data...".len() + "sanity text".len()) as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_test_with_options.txt").unwrap();
file.seek(SeekFrom::Start("sanity text".as_bytes().len() as u64)).unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());File does not exists
use fmmap::{MmapFileExt, MmapFileMutExt, Options};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Write};
// mmap the file with options
let opts = Options::new()
// allow read
.read(true)
// allow write
.write(true)
// allow append
.append(true)
// truncate to 100
.max_size(100);
let mut file = DiskMmapFileMut::open_with_options("disk_open_test_with_options.txt", opts).unwrap();
file.write_all("some data...".as_bytes(), 0).unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate("some modified data...".len() as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_test_with_options.txt").unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());Sourcepub fn open_exist<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn open_exist<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Open an existing file and mmap this file
§Examples
use fmmap::{MmapFileExt, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Write};
// create a temp file
let mut file = File::create("disk_open_existing_test.txt").unwrap();
file.write_all("some data...".as_bytes()).unwrap();
drop(file);
// mmap the file
let mut file = DiskMmapFileMut::open_exist("disk_open_existing_test.txt").unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate("some modified data...".len() as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_existing_test.txt").unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());Sourcepub fn open_exist_with_options<P: AsRef<Path>>(
path: P,
opts: Options,
) -> Result<Self, Error>
pub fn open_exist_with_options<P: AsRef<Path>>( path: P, opts: Options, ) -> Result<Self, Error>
Open an existing file and mmap this file with Options
§Examples
use fmmap::{MmapFileExt, MmapFileMutExt, Options};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Seek, SeekFrom, Write};
// create a temp file
let mut file = File::create("disk_open_existing_test_with_options.txt").unwrap();
file.write_all("sanity text".as_bytes()).unwrap();
file.write_all("some data...".as_bytes()).unwrap();
drop(file);
// mmap the file with options
let opts = Options::new()
// truncate to 100
.max_size(100)
// mmap content after the sanity text
.offset("sanity text".as_bytes().len() as u64);
let mut file = DiskMmapFileMut::open_exist_with_options("disk_open_existing_test_with_options.txt", opts).unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0);
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.truncate(("some modified data...".len() + "sanity text".len()) as u64).unwrap();
file.write_all("some modified data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
drop(file);
// reopen to check content
let mut buf = vec![0; "some modified data...".len()];
let mut file = File::open("disk_open_existing_test_with_options.txt").unwrap();
file.seek(SeekFrom::Start("sanity text".as_bytes().len() as u64)).unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some modified data...".as_bytes());Sourcepub fn open_cow<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn open_cow<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Open and mmap an existing file in copy-on-write mode(copy-on-write memory map backed by a file). Data written to the memory map will not be visible by other processes, and will not be carried through to the underlying file.
§Examples
use fmmap::{MmapFileExt, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Write};
// create a temp file
let mut file = File::create("disk_open_cow_test.txt").unwrap();
file.write_all("some data...".as_bytes()).unwrap();
drop(file);
// mmap the file
let mut file = DiskMmapFileMut::open_cow("disk_open_cow_test.txt").unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0).unwrap();
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.write_all("some data!!!".as_bytes(), 0).unwrap();
file.flush().unwrap();
// cow, change will only be seen in current caller
assert_eq!(file.as_slice(), "some data!!!".as_bytes());
drop(file);
// reopen to check content, cow will not change the content.
let mut file = File::open("disk_open_cow_test.txt").unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some data...".as_bytes());Sourcepub fn open_cow_with_options<P: AsRef<Path>>(
path: P,
opts: Options,
) -> Result<Self, Error>
pub fn open_cow_with_options<P: AsRef<Path>>( path: P, opts: Options, ) -> Result<Self, Error>
Open and mmap an existing file in copy-on-write mode(copy-on-write memory map backed by a file) with Options.
Data written to the memory map will not be visible by other processes, and will not be carried through to the underlying file.
§Examples
use fmmap::{MmapFileExt, MmapFileMutExt, Options};
use fmmap::raw::DiskMmapFileMut;
use std::fs::File;
use std::io::{Read, Seek, Write, SeekFrom};
// create a temp file
let mut file = File::create("disk_open_cow_with_options_test.txt").unwrap();
file.write_all("sanity text".as_bytes()).unwrap();
file.write_all("some data...".as_bytes()).unwrap();
drop(file);
// mmap the file with options
let opts = Options::new()
// mmap content after the sanity text
.offset("sanity text".as_bytes().len() as u64);
let mut file = DiskMmapFileMut::open_cow_with_options("disk_open_cow_with_options_test.txt", opts).unwrap();
let mut buf = vec![0; "some data...".len()];
file.read_exact(buf.as_mut_slice(), 0).unwrap();
assert_eq!(buf.as_slice(), "some data...".as_bytes());
// modify the file data
file.write_all("some data!!!".as_bytes(), 0).unwrap();
file.flush().unwrap();
// cow, change will only be seen in current caller
assert_eq!(file.as_slice(), "some data!!!".as_bytes());
drop(file);
// reopen to check content, cow will not change the content.
let mut file = File::open("disk_open_cow_with_options_test.txt").unwrap();
let mut buf = vec![0; "some data...".len()];
// skip the sanity text
file.seek(SeekFrom::Start("sanity text".as_bytes().len() as u64)).unwrap();
file.read_exact(buf.as_mut_slice()).unwrap();
assert_eq!(buf.as_slice(), "some data...".as_bytes());Sourcepub fn freeze(self) -> Result<DiskMmapFile, Error>
pub fn freeze(self) -> Result<DiskMmapFile, Error>
Returns an immutable version of this memory mapped buffer. If the memory map is file-backed, the file must have been opened with read permissions.
§Errors
This method returns an error when the underlying system call fails, which can happen for a variety of reasons, such as when the file has not been opened with read permissions.
§Examples
use fmmap::MmapFileMutExt;
use fmmap::raw::DiskMmapFileMut;
let mut file = DiskMmapFileMut::create("disk_mmap_file_freeze_test.txt").unwrap();
file.truncate(12);
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
file.freeze().unwrap();Sourcepub fn freeze_exec(self) -> Result<DiskMmapFile, Error>
pub fn freeze_exec(self) -> Result<DiskMmapFile, Error>
Transition the memory map to be readable and executable. If the memory map is file-backed, the file must have been opened with execute permissions.
§Errors
This method returns an error when the underlying system call fails, which can happen for a variety of reasons, such as when the file has not been opened with execute permissions
§Examples
use fmmap::MmapFileMutExt;
use fmmap::raw::DiskMmapFileMut;
let mut file = DiskMmapFileMut::create("disk_mmap_file_freeze_test.txt").unwrap();
file.truncate(12);
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
file.freeze_exec().unwrap();Trait Implementations§
Source§impl From<DiskMmapFileMut> for MmapFileMut
impl From<DiskMmapFileMut> for MmapFileMut
Source§fn from(file: DiskMmapFileMut) -> Self
fn from(file: DiskMmapFileMut) -> Self
Source§impl MmapFileExt for DiskMmapFileMut
impl MmapFileExt for DiskMmapFileMut
Source§fn lock_exclusive(&self) -> Result<()>
fn lock_exclusive(&self) -> Result<()>
Source§fn try_lock_exclusive(&self) -> Result<()>
fn try_lock_exclusive(&self) -> Result<()>
Source§fn slice(&self, offset: usize, sz: usize) -> &[u8] ⓘ
fn slice(&self, offset: usize, sz: usize) -> &[u8] ⓘ
Source§fn bytes(&self, offset: usize, sz: usize) -> Result<&[u8]>
fn bytes(&self, offset: usize, sz: usize) -> Result<&[u8]>
Source§fn path_lossy(&self) -> Cow<'_, str>
fn path_lossy(&self) -> Cow<'_, str>
Source§fn path_string(&self) -> String
fn path_string(&self) -> String
Source§fn copy_range_to_vec(&self, offset: usize, len: usize) -> Vec<u8> ⓘ
fn copy_range_to_vec(&self, offset: usize, len: usize) -> Vec<u8> ⓘ
Source§fn write_all_to_new_file<P: AsRef<Path>>(&self, new_file_path: P) -> Result<()>
fn write_all_to_new_file<P: AsRef<Path>>(&self, new_file_path: P) -> Result<()>
Source§fn write_range_to_new_file<P: AsRef<Path>>(
&self,
new_file_path: P,
offset: usize,
len: usize,
) -> Result<()>
fn write_range_to_new_file<P: AsRef<Path>>( &self, new_file_path: P, offset: usize, len: usize, ) -> Result<()>
Source§fn reader(&self, offset: usize) -> Result<MmapFileReader<'_>>
fn reader(&self, offset: usize) -> Result<MmapFileReader<'_>>
MmapFileReader which helps read data from mmap like a normal File. Read moreSource§fn range_reader(&self, offset: usize, len: usize) -> Result<MmapFileReader<'_>>
fn range_reader(&self, offset: usize, len: usize) -> Result<MmapFileReader<'_>>
MmapFileReader base on the given offset and len, which helps read data from mmap like a normal File. Read moreSource§fn read(&self, dst: &mut [u8], offset: usize) -> usize
fn read(&self, dst: &mut [u8], offset: usize) -> usize
Source§fn read_exact(&self, dst: &mut [u8], offset: usize) -> Result<()>
fn read_exact(&self, dst: &mut [u8], offset: usize) -> Result<()>
Source§fn read_i16(&self, offset: usize) -> Result<i16>
fn read_i16(&self, offset: usize) -> Result<i16>
Source§fn read_i16_le(&self, offset: usize) -> Result<i16>
fn read_i16_le(&self, offset: usize) -> Result<i16>
Source§fn read_isize(&self, offset: usize) -> Result<isize>
fn read_isize(&self, offset: usize) -> Result<isize>
Source§fn read_isize_le(&self, offset: usize) -> Result<isize>
fn read_isize_le(&self, offset: usize) -> Result<isize>
Source§fn read_i32(&self, offset: usize) -> Result<i32>
fn read_i32(&self, offset: usize) -> Result<i32>
Source§fn read_i32_le(&self, offset: usize) -> Result<i32>
fn read_i32_le(&self, offset: usize) -> Result<i32>
Source§fn read_i64(&self, offset: usize) -> Result<i64>
fn read_i64(&self, offset: usize) -> Result<i64>
Source§fn read_i64_le(&self, offset: usize) -> Result<i64>
fn read_i64_le(&self, offset: usize) -> Result<i64>
Source§fn read_i128(&self, offset: usize) -> Result<i128>
fn read_i128(&self, offset: usize) -> Result<i128>
Source§fn read_i128_le(&self, offset: usize) -> Result<i128>
fn read_i128_le(&self, offset: usize) -> Result<i128>
Source§fn read_u16(&self, offset: usize) -> Result<u16>
fn read_u16(&self, offset: usize) -> Result<u16>
Source§fn read_u16_le(&self, offset: usize) -> Result<u16>
fn read_u16_le(&self, offset: usize) -> Result<u16>
Source§fn read_usize(&self, offset: usize) -> Result<usize>
fn read_usize(&self, offset: usize) -> Result<usize>
Source§fn read_usize_le(&self, offset: usize) -> Result<usize>
fn read_usize_le(&self, offset: usize) -> Result<usize>
Source§fn read_u32(&self, offset: usize) -> Result<u32>
fn read_u32(&self, offset: usize) -> Result<u32>
Source§fn read_u32_le(&self, offset: usize) -> Result<u32>
fn read_u32_le(&self, offset: usize) -> Result<u32>
Source§fn read_u64(&self, offset: usize) -> Result<u64>
fn read_u64(&self, offset: usize) -> Result<u64>
Source§fn read_u64_le(&self, offset: usize) -> Result<u64>
fn read_u64_le(&self, offset: usize) -> Result<u64>
Source§fn read_u128(&self, offset: usize) -> Result<u128>
fn read_u128(&self, offset: usize) -> Result<u128>
Source§fn read_u128_le(&self, offset: usize) -> Result<u128>
fn read_u128_le(&self, offset: usize) -> Result<u128>
Source§fn read_f32(&self, offset: usize) -> Result<f32>
fn read_f32(&self, offset: usize) -> Result<f32>
Source§fn read_f32_le(&self, offset: usize) -> Result<f32>
fn read_f32_le(&self, offset: usize) -> Result<f32>
Source§impl MmapFileMutExt for DiskMmapFileMut
impl MmapFileMutExt for DiskMmapFileMut
Source§fn drop_remove(self) -> Result<()>
fn drop_remove(self) -> Result<()>
Remove the underlying file
§Examples
use fmmap::MmapFileMutExt;
use fmmap::raw::DiskMmapFileMut;
let mut file = DiskMmapFileMut::create("disk_remove_test.txt").unwrap();
file.truncate(100);
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
file.remove().unwrap();
let err = std::fs::File::open("disk_remove_test.txt");
assert_eq!(err.unwrap_err().kind(), std::io::ErrorKind::NotFound);Source§fn close_with_truncate(self, max_sz: i64) -> Result<()>
fn close_with_truncate(self, max_sz: i64) -> Result<()>
Close and truncate the underlying file
§Examples
use fmmap::{MetaDataExt, MmapFileExt, MmapFileMutExt};
use fmmap::raw::DiskMmapFileMut;
let mut file = DiskMmapFileMut::create("disk_close_with_truncate_test.txt").unwrap();
file.truncate(100);
file.write_all("some data...".as_bytes(), 0).unwrap();
file.flush().unwrap();
file.close_with_truncate(50).unwrap();
let file = DiskMmapFileMut::open("disk_close_with_truncate_test.txt").unwrap();
let meta = file.metadata().unwrap();
assert_eq!(meta.len(), 50);Source§fn as_mut_slice(&mut self) -> &mut [u8] ⓘ
fn as_mut_slice(&mut self) -> &mut [u8] ⓘ
Source§fn flush(&self) -> Result<()>
fn flush(&self) -> Result<()>
Source§fn flush_async(&self) -> Result<()>
fn flush_async(&self) -> Result<()>
Source§fn flush_range(&self, offset: usize, len: usize) -> Result<()>
fn flush_range(&self, offset: usize, len: usize) -> Result<()>
Source§fn flush_async_range(&self, offset: usize, len: usize) -> Result<()>
fn flush_async_range(&self, offset: usize, len: usize) -> Result<()>
Source§fn truncate(&mut self, max_sz: u64) -> Result<(), Error>
fn truncate(&mut self, max_sz: u64) -> Result<(), Error>
max_size, which will lead to
do re-mmap and sync_dir if the inner is a real file.Source§fn slice_mut(&mut self, offset: usize, sz: usize) -> &mut [u8] ⓘ
fn slice_mut(&mut self, offset: usize, sz: usize) -> &mut [u8] ⓘ
Source§fn bytes_mut(&mut self, offset: usize, sz: usize) -> Result<&mut [u8]>
fn bytes_mut(&mut self, offset: usize, sz: usize) -> Result<&mut [u8]>
Source§fn zero_range(&mut self, start: usize, end: usize)
fn zero_range(&mut self, start: usize, end: usize)
Source§fn writer(&mut self, offset: usize) -> Result<MmapFileWriter<'_>>
fn writer(&mut self, offset: usize) -> Result<MmapFileWriter<'_>>
MmapFileWriter base on the given offset, which helps read or write data from mmap like a normal File. Read moreSource§fn range_writer(
&mut self,
offset: usize,
len: usize,
) -> Result<MmapFileWriter<'_>>
fn range_writer( &mut self, offset: usize, len: usize, ) -> Result<MmapFileWriter<'_>>
MmapFileWriter base on the given offset and len, which helps read or write data from mmap like a normal File. Read moreSource§fn write(&mut self, src: &[u8], offset: usize) -> usize
fn write(&mut self, src: &[u8], offset: usize) -> usize
Source§fn write_all(&mut self, src: &[u8], offset: usize) -> Result<()>
fn write_all(&mut self, src: &[u8], offset: usize) -> Result<()>
src to the mmap from the offset.