Struct gix_tempfile::Handle
source · pub struct Handle<Marker: Debug> { /* private fields */ }
Expand description
A registered temporary file which will delete itself on drop or if the program is receiving signals that should cause it to terminate.
§Note
Signals interrupting the calling thread right after taking ownership of the registered tempfile will cause all but this tempfile to be removed automatically. In the common case it will persist on disk as destructors were not called or didn’t get to remove the file.
In the best case the file is a true temporary with a non-clashing name that ‘only’ fills up the disk, in the worst case the temporary file is used as a lock file which may leave the repository in a locked state forever.
This kind of raciness exists whenever take()
is used and can’t be circumvented.
Implementations§
source§impl Handle<Writable>
impl Handle<Writable>
sourcepub fn persist(
self,
path: impl AsRef<Path>
) -> Result<Option<File>, Error<Writable>>
pub fn persist( self, path: impl AsRef<Path> ) -> Result<Option<File>, Error<Writable>>
Persist this tempfile to replace the file at the given path
if necessary, in a way that recovers the original instance
on error or returns the open now persisted former tempfile.
Note that it might not exist anymore if an interrupt handler managed to steal it and allowed the program to return to
its normal flow.
source§impl Handle<Closed>
impl Handle<Closed>
Creation and ownership transfer
sourcepub fn at(
path: impl AsRef<Path>,
directory: ContainingDirectory,
cleanup: AutoRemove
) -> Result<Self>
pub fn at( path: impl AsRef<Path>, directory: ContainingDirectory, cleanup: AutoRemove ) -> Result<Self>
Create a registered tempfile at the given path
, where path
includes the desired filename and close it immediately.
Depending on the directory
configuration, intermediate directories will be created, and depending on cleanup
empty
intermediate directories will be removed.
§Warning of potential leaks
Without signal handlers installed, tempfiles will remain once a termination signal is encountered as destructors won’t run. See the top-level documentation for more.
sourcepub fn at_with_permissions(
path: impl AsRef<Path>,
directory: ContainingDirectory,
cleanup: AutoRemove,
permissions: Permissions
) -> Result<Self>
pub fn at_with_permissions( path: impl AsRef<Path>, directory: ContainingDirectory, cleanup: AutoRemove, permissions: Permissions ) -> Result<Self>
Like at
, but with support for filesystem permissions
.
source§impl Handle<Writable>
impl Handle<Writable>
Creation and ownership transfer
sourcepub fn at(
path: impl AsRef<Path>,
directory: ContainingDirectory,
cleanup: AutoRemove
) -> Result<Self>
pub fn at( path: impl AsRef<Path>, directory: ContainingDirectory, cleanup: AutoRemove ) -> Result<Self>
Create a registered tempfile at the given path
, where path
includes the desired filename.
Depending on the directory
configuration, intermediate directories will be created, and depending on cleanup
empty
intermediate directories will be removed.
§Warning of potential leaks
Without signal handlers installed, tempfiles will remain once a termination signal is encountered as destructors won’t run. See the top-level documentation for more.
sourcepub fn at_with_permissions(
path: impl AsRef<Path>,
directory: ContainingDirectory,
cleanup: AutoRemove,
permissions: Permissions
) -> Result<Self>
pub fn at_with_permissions( path: impl AsRef<Path>, directory: ContainingDirectory, cleanup: AutoRemove, permissions: Permissions ) -> Result<Self>
Like at
, but with support for filesystem permissions
.
sourcepub fn new(
containing_directory: impl AsRef<Path>,
directory: ContainingDirectory,
cleanup: AutoRemove
) -> Result<Self>
pub fn new( containing_directory: impl AsRef<Path>, directory: ContainingDirectory, cleanup: AutoRemove ) -> Result<Self>
Create a registered tempfile within containing_directory
with a name that won’t clash, and clean it up as specified with cleanup
.
Control how to deal with intermediate directories with directory
.
The temporary file is opened and can be written to using the with_mut()
method.
§Warning of potential leaks
Without signal handlers installed, tempfiles will remain once a termination signal is encountered as destructors won’t run. See the top-level documentation for more.
sourcepub fn take(self) -> Option<NamedTempFile>
pub fn take(self) -> Option<NamedTempFile>
Take ownership of the temporary file.
It’s a theoretical possibility that the file isn’t present anymore if signals interfere, hence the Option
sourcepub fn close(self) -> Result<Handle<Closed>>
pub fn close(self) -> Result<Handle<Closed>>
Close the underlying file handle but keep track of the temporary file as before for automatic cleanup.
This saves system resources in situations where one opens a tempfile file at a time, writes a new value, and closes it right after to perform more updates of this kind in other tempfiles. When all succeed, they can be renamed one after another.
source§impl Handle<Writable>
impl Handle<Writable>
Mutation
sourcepub fn with_mut<T>(
&mut self,
once: impl FnOnce(&mut NamedTempFile) -> T
) -> Result<T>
pub fn with_mut<T>( &mut self, once: impl FnOnce(&mut NamedTempFile) -> T ) -> Result<T>
Obtain a mutable handler to the underlying named tempfile and call f(&mut named_tempfile)
on it.
Note that for the duration of the call, a signal interrupting the operation will cause the tempfile not to be cleaned up as it is not visible anymore to the signal handler.
§Assumptions
The caller must assure that the signal handler for cleanup will be followed by an abort call so that this code won’t run again on a removed instance. An error will occur otherwise.
Trait Implementations§
source§impl Read for Handle<Writable>
impl Read for Handle<Writable>
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read
, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf
. Read more1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf
. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf
. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)cursor
. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read
. Read moresource§impl Seek for Handle<Writable>
impl Seek for Handle<Writable>
source§fn seek(&mut self, pos: SeekFrom) -> Result<u64>
fn seek(&mut self, pos: SeekFrom) -> Result<u64>
1.55.0 · source§fn rewind(&mut self) -> Result<(), Error>
fn rewind(&mut self) -> Result<(), Error>
source§fn stream_len(&mut self) -> Result<u64, Error>
fn stream_len(&mut self) -> Result<u64, Error>
seek_stream_len
)source§impl Write for Handle<Writable>
impl Write for Handle<Writable>
source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)