У меня есть ситуация, когда мне нужно сохранить загруженный HttpPostedFile
на диск сервера, предоставить полный путь к некоторому коду, который что-то сделает с файлом на диске, а затем удалит файл. Я решил сделать прокси для работы с файлом. Прокси абстрагирует детали сохранения файла на диск и удаления его, если он больше не используется. Я реализовал IDisposable в прокси-сервере, чтобы обработать сохраненный файл как неуправляемый ресурс и убедиться, что он удаляется в какой-то момент. Конечно, каждый раз, когда я пытаюсь реализовать IDisposable, я дважды проверяю шаблон и обнаруживаю десятки, вопросы и статьи по этой теме, охватывающие все самые сложные реализации.Использование IDisposable для удаления файла с диска
Я думаю, что большинство из этих реализаций являются излишними для того, что мне нужно, поэтому я реализовал это гораздо проще. В моем классе не так много; есть только сохранение файла и нескольких общедоступных строк, чтобы разрешить доступ к сохраненному файлу через его путь к файлу. Существует метод Delete для явного удаления файла и метод Dispose для вызова Delete, если клиентский код этого не делает. И, наконец, есть финализатор, который просто вызывает Dispose. Класс запечатан. Нет членов, которые реализуют IDisposable самостоятельно. Нет значительных управляемых ресурсов. По моей оценке, нет необходимости продолжать вмешиваться в сборку мусора, поскольку единственной важной вещью, которая должна произойти, является удаление файла.
Так мои вопросы таковы:
- Что плохого в борьбе с сохранением и удалением файла «Темп» в этой моде?
- Есть ли проблемы с моей реализацией IDisposable ниже, учитывая, что мне не нужно беспокоиться об очистке управляемых ресурсов.
Обратите внимание, что в моем прецеденте файл должен быть сохранен на диск для другого фрагмента кода для работы с ним, и файл должен быть доступен с использованием пути к файлу, а не путем передачи потоков или чего-либо еще как это.
public sealed class TempFileProxy : IDisposable
{
private bool disposed;
public TempFileProxy(HttpPostedFile httpPostedFile)
{
this.disposed = false;
this.FileName = httpPostedFile.FileName;
this.Directory = AppSettings("TempFileDirectory");
this.FullPath = [email protected]"{this.Directory}\{this.FileName}";
httpPostedFile.SaveAs(this.FullPath);
}
~TempFileProxy()
{
this.Dispose();
}
public string FullPath { get; }
public string Directory { get; }
public string FileName { get; }
public void Dispose()
{
if (this.disposed)
{
return;
}
this.disposed = true;
this.Delete();
}
public void Delete()
{
if (File.Exists(this.FullPath))
{
File.Delete(this.FullPath);
}
}
}
Этот вопрос может быть применим для [Code Review] (http://codereview.stackexchange.com/help), если (а) ваш код работает по назначению, (b) ваш код является реальным кодом, а не пример кода, и (c) ваш код включен в тело вопроса. Если вы хотите, чтобы экспертная оценка улучшала все аспекты вашего кода, отправьте ее на обзор кода. –