Удаляются ли файлы, созданные с помощью Path.GetTempFileName, автоматически?
Я всегда считал, что ответ да, но теперь я пытаюсь найти правду.
Когда я создаю временный файл с помощью Path.GetTempFileName()
, автоматически ли очистятся окна позже?
Как насчет создания каталога под Path.GetTempPath()
? Будут ли окна очищены?
Или ответственность разработчика за удаление файлов, созданных там?
Ответы
Ответ 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
Вы хотите очистить временные файлы, чтобы избежать этого!