Как создать временный файл (для записи на) в С#?
Возможный дубликат:
Создание папок tempory
Я ищу что-то вроде модуля tempfile
в Python: (желательно) безопасный способ открыть файл для записи. Это должно быть легко удалить, когда я тоже закончил...
Похоже, в .NET нет функций "с батарейками" модуля tempfile
, который не только создает файл, но и возвращает дескриптор файла (старая школа, я знаю...) к нему вместе с путь. В то же время он гарантирует, что только создающий пользователь сможет получить доступ к файлу и whatnot (mkstemp()
я думаю): https://docs.python.org/library/tempfile.html
А, да, я это вижу. Но GetTempFileName имеет недостаток: есть условие гонки между тем, когда файл был создан (при вызове GetTempFileName создается файл размером 0 байт), и когда я его открываю (после возврата GetTempFileName). Это может быть проблема безопасности, хотя не для моего текущего приложения...
Ответы
Ответ 1
У меня также было такое же требование раньше, и я создал небольшой класс для его решения:
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;
}
}
Создает временный файл в указанной вами папке или в системной временной папке. Это одноразовый класс, поэтому в конце его жизни (либо Dispose
или деструктор) он удаляет файл. Вы получите имя созданного файла (и пути) через свойство FilePath
. Вы можете, конечно, расширить его, чтобы открыть файл для записи и вернуть его связанный FileStream
.
Пример использования:
using (var tempFile = new TemporaryFile()) {
// use the file through tempFile.FilePath...
}
Ответ 2
Path.GetTempFileName и Path.GetTempPath. Затем вы можете использовать эту ссылку для чтения/записи зашифрованных данных в файл.
Примечание..NET - не самая лучшая платформа для критически важных приложений безопасности. Вы должны хорошо разбираться в том, как работает CLR, чтобы избежать некоторых ошибок, которые могли бы подвергнуть ваши критические данные хакерам.
Изменить: о состоянии гонки... Вы можете использовать GetTempPath, а затем создать временное имя файла, используя
Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP"))
Ответ 3
Я не знаю ни одного встроенного (внутри рамки) класса, чтобы сделать это, но я думаю, что это не будет слишком большой проблемой, чтобы катить свои собственные.
Очевидно, это зависит от типа данных, которые вы хотите записать на него, и требуется "безопасность".
Эта статья о DevFusion может быть хорошим местом для начала?