use std::{
fs::Metadata,
io::{Result, SeekFrom},
path::Path,
};
pub use tokio::fs::{metadata, read};
use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};
pub struct File {
inner: tokio::fs::File,
}
impl File {
pub async fn open(path: impl AsRef<Path>) -> Result<File> {
Ok(File {
inner: tokio::fs::File::open(path).await?,
})
}
pub async fn create(path: impl AsRef<Path>) -> Result<File> {
Ok(File {
inner: tokio::fs::File::create(path).await?,
})
}
pub async fn read_at(&mut self, buf: &mut [u8], offset: u64) -> Result<usize> {
self.inner.seek(SeekFrom::Start(offset)).await?;
let len = self.inner.read(buf).await?;
Ok(len)
}
pub async fn write_all_at(&mut self, buf: &[u8], offset: u64) -> Result<()> {
self.inner.seek(SeekFrom::Start(offset)).await?;
self.inner.write_all(buf).await?;
Ok(())
}
pub async fn set_len(&self, size: u64) -> Result<()> {
self.inner.set_len(size).await
}
pub async fn sync_all(&self) -> Result<()> {
self.inner.sync_all().await
}
pub async fn metadata(&self) -> Result<Metadata> {
self.inner.metadata().await
}
}