How to create a temporary file (for writing to) in C#?
.net, c#, temporary-files, windows
Solution
I've also had the same requirement before, and I've created a small class to solve it:
public sealed class TemporaryFile : IDisposable {
public TemporaryFile() :
this(Path.GetTempPath()) { }
public TemporaryFile(string directory) {
Create(Path.Combine(directory, Path.GetRandomFileName()));
}
~TemporaryFile() {
Delete();
}
public void Dispose() {
Delete();
GC.SuppressFinalize(this);
}
public string FilePath { get; private set; }
private void Create(string path) {
FilePath = path;
using (File.Create(FilePath)) { };
}
private void Delete() {
if (FilePath == null) return;
File.Delete(FilePath);
FilePath = null;
}
}
It creates a temporary file in a folder you specify or in the system temporary folder. It's a disposable class, so at the end of its life (either `Dispose` or the destructor), it deletes the file. You get the name of the file created (and path) through the `FilePath` property. You can certainly extend it to also open the file for writing and return its associated `FileStream`.
An example usage:
using (var tempFile = new TemporaryFile()) {
// use the file through tempFile.FilePath...
}
Problem
I'm looking for something like the `tempfile` module in Python: A (preferably) secure way to open a file for writing to. This should be easy to delete when I'm done too... It seems, .NET does not have the "batteries included" features of the `tempfile` module, which not only creates the file, but returns the file descriptor (old school, I know...) to it along with the path. At the same time, it makes sure only the creating user can access the file and whatnot (`mkstemp()` I think): https://docs.python.org/library/tempfile.html Ah, yes, I can see that. But GetTempFileName does have a drawback: There is a race condition between when the file was created (upon call to GetTempFileName a 0-Byte file gets created) and when I get to open it (after return of GetTempFileName). This might be a security issue, although not for my current application...