Удаление временных файлов после использования

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

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

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

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

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

Маттиас

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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

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

Update:

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

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

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

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

Ответ 6

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

Ответ 7

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

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();

в начале приложения.

Ответ 8

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

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

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

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

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