Удаление временных файлов после использования - PullRequest
13 голосов
/ 18 марта 2009

Мне нужно работать с некоторыми временными файлами в моем приложении Windows Forms .NET 3.5. Эти файлы открываются во внешнем приложении, которое, конечно, может работать дольше, чем моя собственная программа.

Существуют ли передовые методики очистки этих временных файлов в любое время, чтобы избежать заполнения жесткого диска пользователя «ненужными» файлами, которые больше не нужны? Или даже Windows справляется с этим автоматически?

Хорошим примером является любой почтовый клиент: когда вы открываете вложение в любом приложении, оно обычно записывается во временный файл, который открывается. Есть ли способ выяснить, как эти файлы управляют очисткой?

Использование Google показало мне много-много инструментов очистки и настройки для очистки временного каталога вручную, но я бы не хотел заставлять пользователей делать это. : -)

Любая помощь приветствуется.

Matthias

Ответы [ 8 ]

27 голосов
/ 18 марта 2009

В .NET вы можете использовать класс <a href="http://msdn.microsoft.com/en-us/library/system.codedom.compiler.tempfilecollection.aspx" rel="noreferrer">TempFileCollection</a> для управления набором временных файлов, которые будут очищены вашим приложением (обратите внимание, что он довольно скрыт в пространстве имен CodeDom). Очевидно, что вы не можете удалить файлы, не принадлежащие вам, потому что эти файлы все равно могут быть открыты другим приложением (и их удаление может вызвать серьезные проблемы).

6 голосов
/ 18 марта 2009

Ответственность за очистку временных файлов должна лежать на приложении, которое их создало. Это очень просто. Я использую класс, который выглядит примерно так:

public class TempFile : IDisposable
{
    public TempFile()
    { this.path = System.IO.Path.GetTempFileName(); }

    public void Dispose()
    { File.Delete(path); }

    private string path;
    public string Path { get { return path; } }
}

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

5 голосов
/ 18 марта 2009

Если вы попытаетесь детерминистически очистить содержимое папки типа «Временные файлы», вы рискуете удалить файлы, которые используются другими процессами. Операционная система Windows предоставляет инструменты, позволяющие пользователям удалять эти файлы, когда доступное дисковое пространство тома достигает определенного порога.

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

2 голосов
/ 21 мая 2009

У нас похожая проблема с временем жизни файла - приложение (winforms) может извлечь документ из центрального хранилища репозитория для просмотра пользователем, но пользователь должен иметь возможность закрыть наше приложение, чтобы оно не влияло на просматриваемый файл. Из соображений безопасности файлы документов необходимо очистить, чтобы они не лежали слишком долго.

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

1 голос
/ 19 ноября 2014

Я использую это решение (довольно надежное):

using System.IO;
using System.Reflection;

namespace Konard.Helpers
{
    public static partial class TemporaryFiles
    {
        private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt";
        static private readonly object UsedFilesListLock = new object();

        private static string GetUsedFilesListFilename()
        {
            return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix;
        }

        private static void AddToUsedFilesList(string filename)
        {
            lock (UsedFilesListLock)
            {
                using (var writer = File.AppendText(GetUsedFilesListFilename()))
                    writer.WriteLine(filename);
            }
        }

        public static string UseNew()
        {
            var filename = Path.GetTempFileName();
            AddToUsedFilesList(filename);
            return filename;
        }

        public static void DeleteAllPreviouslyUsed()
        {
            lock (UsedFilesListLock)
            {
                var usedFilesListFilename = GetUsedFilesListFilename();

                if (!File.Exists(usedFilesListFilename))
                    return;

                using (var listFile = File.Open(usedFilesListFilename, FileMode.Open))
                {
                    using (var reader = new StreamReader(listFile))
                    {
                        string tempFileToDelete;
                        while ((tempFileToDelete = reader.ReadLine()) != null)
                        {
                            if (File.Exists(tempFileToDelete))
                                File.Delete(tempFileToDelete);
                        }
                    }
                }

                // Clean up
                using (File.Open(usedFilesListFilename, FileMode.Truncate)) { }
            }
        }
    }
}

Каждый раз, когда вам нужно временное использование файла:

var tempFile = TemporaryFiles.UseNew();

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

TemporaryFiles.DeleteAllPreviouslyUsed();

при запуске приложения.

1 голос
/ 06 августа 2009

При использовании временных файлов в ASP.NET используйте событие PAGE_DISPOSED, чтобы удалить все временные файлы, созданные на странице. В противном случае вы можете столкнуться с конфликтом с компонентами, которые не отпускаются, пока не УДАЛЕНЫ.

1 голос
/ 18 марта 2009

Я считаю, что они будут удалены, когда пользователь выйдет из системы.

В те дни, когда люди каждый день выключали свои ПК, это было, вероятно, идеальным решением.

Теперь люди потенциально могут месяцами не выходить из системы, так что полагаться на это может быть плохой идеей.

Кроме того, если они выключат свою машину без выключения, файлы также не будут удалены.

Вы можете использовать средство наблюдения за файловой системой, которое наблюдает за файлом, который вы пишете, и подождать некоторое время бездействия (10 минут, 1 час, 1 день или что-либо еще), а затем удалить файл.

Это не будет работать для всех, хотя. Некоторые программы могут иметь файл «открыть», но не может заблокировать основной файл. Если это произойдет, у вас не будет возможности узнать, когда безопасно удалить файл.

Однако я думаю, что вы, вероятно, можете просто проигнорировать проблему. Большинство людей, вероятно, в любом случае имеют избыток места на жестком диске, поэтому они вряд ли столкнутся с ним. Если они это сделают, я думаю, что Windows выдает диалоговое окно с нехваткой дискового пространства, которое дает им возможность очистить временный каталог, что решит проблему.

Обновление:

Я думаю, что Центр обновления Windows будет перезагружать компьютер пользователя примерно раз в месяц, поэтому временные файлы должны быть очищены, когда это произойдет.

Нет никаких гарантий, что проблем не будет, но на практике я думаю, что это должно быть довольно редко.

Обновление 2:

В ответ на комментарий я пошел и действительно протестировал это, и похоже, что окна не удаляют временные файлы, когда пользователь выходит из системы. Тем не менее, я все еще говорю, что в случае с ОП это не реальная проблема. Когда это становится проблемой (из-за недостатка места на диске), Windows предложит пользователю удалить временные файлы.

0 голосов
/ 06 августа 2009
  • вы можете создать один временный файл, в котором вы можете продолжать записывать имена файлов, созданные в процессе, в конце обработки вы можете (предварительное условие - реализовать IDisposable и) удалить в методе Disponse после операции завершено.

  • Другим способом является независимый от записи процесс, который выполняет очистку каждый интервал.

  • Прикрепите дату в конце файла и удалите в конце дня с этой датой, и процесс создаст новые файлы с новой датой в конце.

  • одно хорошее предложение, данное классом divo tempfilecollection.

надеюсь, это поможет.

...