Crates.io | async-fd-lock |
lib.rs | async-fd-lock |
version | 0.2.0 |
source | src |
created_at | 2024-06-23 01:39:43.245836 |
updated_at | 2024-06-23 16:12:36.629442 |
description | Advisory cross-platform file locks using file descriptors with async support by spawning blocking tasks. |
homepage | |
repository | https://github.com/Limeth/async-fd-lock |
max_upload_size | |
id | 1280914 |
size | 55,183 |
Advisory cross-platform file locks using file descriptors, with async support by off-loading blocking operations to newly spawned blocking tasks. Adapted from yoshuawuyts/fd-lock, which was adapted from mafintosh/fd-lock.
Note that advisory lock compliance is opt-in, and can freely be ignored by other parties. This means this crate should never be used for security purposes, but solely to coordinate file access.
Basic usage
use std::path::PathBuf;
use tokio::fs::File;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use async_fd_lock::{LockRead, LockWrite};
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("foo.txt");
// Lock it for writing.
{
let mut write_guard = File::options()
.create_new(true)
.write(true)
.truncate(true)
.open(&path).await?
.lock_write().await
.map_err(|(_, err)| err)?;
write_guard.write(b"bongo cat").await?;
}
// Lock it for reading.
{
let mut read_guard_1 = File::open(&path).await?.lock_read().await.map_err(|(_, err)| err)?;
let mut read_guard_2 = File::open(&path).await?.lock_read().await.map_err(|(_, err)| err)?;
let byte_1 = read_guard_1.read_u8().await?;
let byte_2 = read_guard_2.read_u8().await?;
}
$ cargo add async-fd-lock
This crate uses unsafe
on Windows to interface with windows-sys
. All
invariants have been carefully checked, and are manually enforced.
rustix::fs::flock
windows_sys::Win32::Storage::FileSystem::LockFile
MIT OR Apache-2.0