Сведения о вопросе

rjevskii

19:22, 6th August, 2020

Теги

c#   temporary-files    

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

Просмотров: 612   Ответов: 3

Возможный Дубликат:
Создание временных папок

Я ищу что-то вроде модуля tempfile в Python: (предпочтительно) безопасный способ открыть файл для записи. Это должно быть легко удалить, когда я тоже закончу...

Похоже, .NET не имеет функций "batteries included" модуля tempfile , который не только создает файл, но и возвращает файловый дескриптор (старая школа, Я знаю...) к нему вместе с тропой. В то же время, он гарантирует, что только создающий пользователь может получить доступ к файлу и тому подобному ( mkstemp() я думаю): https://docs.python.org/library/tempfile.html


Ах, да, я вижу это. Но у GetTempFileName есть недостаток: есть условие гонки между тем, когда файл был создан (при вызове GetTempFileName создается 0-байтовый файл) и когда я получаю его открыть (после возвращения GetTempFileName). Это может быть проблемой безопасности, хотя и не для моего текущего приложения...



  Сведения об ответе

prince

19:16, 16th August, 2020

У меня также было такое же требование раньше, и я создал небольшой класс, чтобы решить его:

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...
}


  Сведения об ответе

pumpa

23:53, 13th August, 2020

Path.GetTempFileName и Path.GetTempPath. Затем вы можете использовать эту ссылку для чтения / записи зашифрованных данных в файл.

Обратите внимание, что .NET-это не лучшая платформа для критически важных приложений безопасности. Вы должны быть хорошо осведомлены о том, как работает CLR, чтобы избежать некоторых ловушек, которые могут подвергнуть ваши критические данные хакерам.

Правка: о состоянии гонки... Вы можете использовать GetTempPath, а затем создать временное имя файла с помощью

Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP"))


  Сведения об ответе

P_S_S

20:00, 15th August, 2020

Я не знаю ни одного встроенного (в рамках фреймворка) класса, чтобы сделать это, но я думаю, что это не будет слишком большой проблемой, чтобы запустить свой собственный..

Очевидно, что это зависит от типа данных, которые вы хотите записать в него, и требуемой "security"..

Эта статья на DevFusion может быть хорошим местом для начала?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться