Как создать временный файл (для записи на) в С#?

Возможный дубликат:
Создание папок 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 может быть хорошим местом для начала?