Struct Builder
pub struct Builder<'a, 'b> { /* private fields */ }
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>(&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>(&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(&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(&mut self, append: bool) -> &mut SelfConfigure the file to be opened in append-only mode.
Default:
false.Examples
use Builder; let named_tempfile = new .append .tempfile?; # Ok::fn permissions(&mut self, permissions: Permissions) -> &mut SelfSet the permissions for the new temporary file/directory.
Platform Notes
Windows
This setting is only fully-supported on unix-like platforms. On Windows, if this method is called with a
Permissionsobject wherepermissions.readonlyreturns true, creating temporary files and directories will fail with an error.Unix
On unix-like systems, 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. In other words, depending on your umask, the permissions of the created file may be more restrictive (but never more permissive) than the ones you specified.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.WASI
While custom permissions are allowed on WASI, they will be ignored as the platform has no concept of permissions or file modes (or multiple users for that matter).
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(&mut self, disable_cleanup: bool) -> &mut SelfDisable cleanup of the file/folder to even when the
NamedTempFile/TempDirgoes out of scope. PreferNamedTempFile::keepandTempDir::keepwhere possible;disable_cleanupis 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(&mut self, keep: bool) -> &mut SelfDeprecated alias for
Builder::disable_cleanup.fn tempfile(&self) -> 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, dir: P) -> 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) -> 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, dir: P) -> 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, f: F) -> Result<NamedTempFile<R>> where F: FnMut(&Path) -> 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, dir: P, f: F) -> Result<NamedTempFile<R>> where F: FnMut(&Path) -> 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::
Trait Implementations
impl Default for Builder<'_, '_>
fn default() -> Self
impl<'a, 'b> Clone for Builder<'a, 'b>
fn clone(&self) -> Builder<'a, 'b>
impl<'a, 'b> Debug for Builder<'a, 'b>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<'a, 'b> Eq for Builder<'a, 'b>
impl<'a, 'b> PartialEq for Builder<'a, 'b>
fn eq(&self, other: &Builder<'a, 'b>) -> bool
impl<'a, 'b> StructuralPartialEq for Builder<'a, 'b>
Auto Trait Implementations
impl<'a, 'b> Freeze for Builder<'a, 'b>
impl<'a, 'b> RefUnwindSafe for Builder<'a, 'b>
impl<'a, 'b> Send for Builder<'a, 'b>
impl<'a, 'b> Sync for Builder<'a, 'b>
impl<'a, 'b> Unpin for Builder<'a, 'b>
impl<'a, 'b> UnsafeUnpin for Builder<'a, 'b>
impl<'a, 'b> UnwindSafe for Builder<'a, 'b>
Blanket Implementations
impl<T> Any for Builder<'a, 'b>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Builder<'a, 'b>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Builder<'a, 'b>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Builder<'a, 'b>
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for Builder<'a, 'b>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for Builder<'a, 'b>
where
T: Clone,
type Owned = T;fn to_owned(&self) -> Tfn clone_into(&self, target: &mut T)
impl<T, U> Into<U> for Builder<'a, 'b>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for Builder<'a, 'b>
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for Builder<'a, 'b>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>