Подтвердить что ты не робот

Удаляются ли файлы, созданные с помощью Path.GetTempFileName, автоматически?

Я всегда считал, что ответ да, но теперь я пытаюсь найти правду.

Когда я создаю временный файл с помощью Path.GetTempFileName(), автоматически ли очистятся окна позже?

Как насчет создания каталога под Path.GetTempPath()? Будут ли окна очищены?

Или ответственность разработчика за удаление файлов, созданных там?

4b9b3361

Ответ 1

Нет, они не удаляются автоматически. Чтобы создать файл, который будет удален автоматически при его закрытии, перейдите FILE_FLAG_DELETE_ON_CLOSE в CreateFile.

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

Чтобы получить доступ к этой функции Win32 из .net, используйте класс SafeFileHandle.

Ответ 2

Нет. Я не буду. Вот почему http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx конкретно указывает: "Метод GetTempFileName приведет к созданию исключения IOException, если нет уникального временного имени файла. Чтобы устранить эту ошибку, удалите все ненужные временные файлы."

Ответ 3

Для моих приложений Windows Forms и WPF я добавил событие для удаления файла, когда приложение закрыто. Вот так:

private string GetTempFile() {
    string tmpfile = Path.GetTempFileName();
    this.Closed += (object sender, EventArgs e) => {
        if (File.Exists(tmpfile))
            File.Delete(tmpfile);
    };
    return tmpfile;
}

Ответ 4

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

//Open it now and cleanup when program closes
Process p = Process.Start(path);
p.EnableRaisingEvents = true;
p.Exited += (sender, e) =>
{
    try
    {
        File.Delete(path);
    }
    catch { } //Suppress errors
};

Ответ 5

Ответ на вопрос - нет, и вы, вероятно, никогда не заметите, пока не достигнете tmpFFFF.tmp и не получите ошибку. Если это на веб-сервере, ваша операция будет терпеть неудачу.

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

Запуск в качестве консольного приложения в Windows 8 дает мне путь в моем локальном prpofile:

C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp

И в IIS с Load User Profile = True для AppPool я получаю:

C:\Users\APPPOOL_NAME\AppData\Local\Temp

И когда Load User Profile = False, я получаю более управляемый:

C:\Windows\TEMP\tmp7C32.tmp

Вы хотите очистить временные файлы, чтобы избежать этого!