Struct Builder
struct Builder<'a, 'b> { ... }
Create a new temporary file or directory with custom options.
Implementations
impl<'a, 'b> Builder<'a, 'b>
fn new() -> SelfCreate a new
Builder.Examples
Create a named temporary file and write some data into it:
use OsStr; use Builder; let named_tempfile = new .prefix .suffix .rand_bytes .tempfile?; let name = named_tempfile .path .file_name.and_then; if let Some = name # Ok::Create a temporary directory and add a file to it:
use Write; use File; use OsStr; use Builder; let dir = new .prefix .rand_bytes .tempdir?; let file_path = dir.path.join; let mut file = create?; writeln!?; // By closing the `TempDir` explicitly, we can check that it has // been deleted successfully. If we don't close it explicitly, // the directory will still be deleted when `dir` goes out // of scope, but we won't know whether deleting the directory // succeeded. drop; dir.close?; # Ok::Create a temporary directory with a chosen prefix under a chosen folder:
use tempfile::Builder; let dir = Builder::new() .prefix("my-temporary-dir") .tempdir_in("folder-with-tempdirs")?; # Ok::<(), std::io::Error>(())fn prefix<S: AsRef<OsStr> + ?Sized>(self: &mut Self, prefix: &'a S) -> &mut SelfSet a custom filename prefix.
Path separators are legal but not advisable. Default:
.tmp.Examples
use Builder; let named_tempfile = new .prefix .tempfile?; # Ok::fn suffix<S: AsRef<OsStr> + ?Sized>(self: &mut Self, suffix: &'b S) -> &mut SelfSet a custom filename suffix.
Path separators are legal but not advisable. Default: empty.
Examples
use Builder; let named_tempfile = new .suffix .tempfile?; # Ok::fn rand_bytes(self: &mut Self, rand: usize) -> &mut SelfSet the number of random bytes.
Default:
6.Examples
use Builder; let named_tempfile = new .rand_bytes .tempfile?; # Ok::fn append(self: &mut Self, append: bool) -> &mut SelfSet the file to be opened in append mode.
Default:
false.Examples
use Builder; let named_tempfile = new .append .tempfile?; # Ok::fn permissions(self: &mut Self, permissions: std::fs::Permissions) -> &mut SelfThe permissions to create the tempfile or tempdir with.
Security
By default, the permissions of tempfiles on Unix are set for it to be readable and writable by the owner only, yielding the greatest amount of security. As this method allows to widen the permissions, security would be reduced in such cases.
Platform Notes
Unix
The actual permission bits set on the tempfile or tempdir will be affected by the
umaskapplied by the underlying syscall. The actual permission bits are calculated viapermissions & !umask.Permissions default to
0o600for tempfiles and0o777for tempdirs. Note, this doesn't include effects of the currentumask. For example, combined with the standard umask0o022, the defaults yield0o600for tempfiles and0o755for tempdirs.Windows and others
This setting is unsupported and trying to set a file or directory read-only will return an error.
Examples
Create a named temporary file that is world-readable.
# # # Ok::Create a named temporary directory that is restricted to the owner.
# # # Ok::fn disable_cleanup(self: &mut Self, disable_cleanup: bool) -> &mut SelfDisable cleanup of the file/folder to even when the
NamedTempFile/TempDirgoes out of scope. PreferNamedTempFile::keepand[TempDir::keep](TempDir::keep) where possible,disable_cleanup` is provided for testing & debugging.By default, the file/folder is automatically cleaned up in the destructor of
NamedTempFile/TempDir. Whendisable_cleanupis set totrue, this behavior is suppressed. If you wish to disable cleanup after creating a temporary file/directory, callNamedTempFile::disable_cleanuporTempDir::disable_cleanup.Warnings
On some platforms (for now, only Windows), temporary files are marked with a special "temporary file" (
FILE_ATTRIBUTE_TEMPORARY) attribute. Disabling cleanup will not unset this attribute while callingNamedTempFile::keepwill.Examples
use Builder; let named_tempfile = new .disable_cleanup .tempfile?; # Ok::fn keep(self: &mut Self, keep: bool) -> &mut SelfDeprecated alias for
Builder::disable_cleanup.fn tempfile(self: &Self) -> io::Result<NamedTempFile>Create the named temporary file.
Security
See the security docs on
NamedTempFile.Resource leaking
See the resource leaking docs on
NamedTempFile.Errors
If the file cannot be created,
Erris returned.Examples
use Builder; let tempfile = new.tempfile?; # Ok::fn tempfile_in<P: AsRef<Path>>(self: &Self, dir: P) -> io::Result<NamedTempFile>Create the named temporary file in the specified directory.
Security
See the security docs on
NamedTempFile.Resource leaking
See the resource leaking docs on
NamedTempFile.Errors
If the file cannot be created,
Erris returned.Examples
use Builder; let tempfile = new.tempfile_in?; # Ok::fn tempdir(self: &Self) -> io::Result<TempDir>Attempts to make a temporary directory inside of [
env::temp_dir()] whose name will have the prefix,prefix. The directory and everything inside it will be automatically deleted once the returnedTempDiris destroyed.Resource leaking
See the resource leaking docs on
TempDir.Errors
If the directory can not be created,
Erris returned.Examples
use Builder; let tmp_dir = new.tempdir?; # Ok::fn tempdir_in<P: AsRef<Path>>(self: &Self, dir: P) -> io::Result<TempDir>Attempts to make a temporary directory inside of
dir. The directory and everything inside it will be automatically deleted once the returnedTempDiris destroyed.Resource leaking
See the resource leaking docs on
TempDir.Errors
If the directory can not be created,
Erris returned.Examples
use Builder; let tmp_dir = new.tempdir_in?; # Ok::fn make<F, R>(self: &Self, f: F) -> io::Result<NamedTempFile<R>> where F: FnMut(&Path) -> io::Result<R>Attempts to create a temporary file (or file-like object) using the provided closure. The closure is passed a temporary file path and returns an
std::io::Result. The path provided to the closure will be inside of [env::temp_dir()]. UseBuilder::make_into provide a custom temporary directory. If the closure returns one of the following errors, then another randomized file path is tried:This can be helpful for taking full control over the file creation, but leaving the temporary file path construction up to the library. This also enables creating a temporary UNIX domain socket, since it is not possible to bind to a socket that already exists.
Note that
Builder::appendis ignored when usingBuilder::make.Security
This has the same security implications as
NamedTempFile, but with additional caveats. Specifically, it is up to the closure to ensure that the file does not exist and that such a check is atomic. Otherwise, a time-of-check to time-of-use bug could be introduced.For example, the following is not secure:
use File; use Builder; // This is NOT secure! let tempfile = new.make?; # Ok::Note that simply using
std::fs::File::createalone is not correct because it does not fail if the file already exists:use Builder; use File; // This could overwrite an existing file! let tempfile = new.make?; # Ok::For creating regular temporary files, use
Builder::tempfileinstead to avoid these problems. This function is meant to enable more exotic use-cases.Resource leaking
See the resource leaking docs on
NamedTempFile.Errors
If the closure returns any error besides
std::io::ErrorKind::AlreadyExistsorstd::io::ErrorKind::AddrInUse, thenErris returned.Examples
# # # Ok::fn make_in<F, R, P>(self: &Self, dir: P, f: F) -> io::Result<NamedTempFile<R>> where F: FnMut(&Path) -> io::Result<R>, P: AsRef<Path>This is the same as
Builder::make, exceptdiris used as the base directory for the temporary file path.See
Builder::makefor more details and security implications.Examples
# # # Ok::
impl Default for Builder<'_, '_>
fn default() -> Self
impl<'a, 'b> Clone for Builder<'a, 'b>
fn clone(self: &Self) -> Builder<'a, 'b>
impl<'a, 'b> Debug for Builder<'a, 'b>
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<'_>) -> $crate::fmt::Result
impl<'a, 'b> Eq for Builder<'a, 'b>
impl<'a, 'b> Freeze for Builder<'a, 'b>
impl<'a, 'b> PartialEq for Builder<'a, 'b>
fn eq(self: &Self, other: &Builder<'a, 'b>) -> bool
impl<'a, 'b> RefUnwindSafe for Builder<'a, 'b>
impl<'a, 'b> Send for Builder<'a, 'b>
impl<'a, 'b> StructuralPartialEq for Builder<'a, 'b>
impl<'a, 'b> Sync for Builder<'a, 'b>
impl<'a, 'b> Unpin for Builder<'a, 'b>
impl<'a, 'b> UnwindSafe for Builder<'a, 'b>
impl<T> Any for Builder<'a, 'b>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Builder<'a, 'b>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Builder<'a, 'b>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for Builder<'a, 'b>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for Builder<'a, 'b>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for Builder<'a, 'b>
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T, U> Into for Builder<'a, 'b>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Builder<'a, 'b>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Builder<'a, 'b>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>