Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Удаление файла


Автор: cosmonaft 2.4.2008, 12:33
Привет. Есть такая простенькая задачка - удалить файл с диска после того как он был отправлен вложением по почте.
Проблема в том, что метод delete() не всегда работает (например файл занят другим приложением). Пробовал перед удалением вызывать System.gc() - срабатывает в 80 процентах случаев, т.к. сам GC не всегда вызывается.
Так вот, при вложении файла в письмо, сам файл заблокирован некоторое время и нужно освободить ресурсы, но что именно - не знаю. Помогите, вот код для вложения файла в письмо:
Код

....
protected MimeMultipart multipart;
protected BodyPart bodyText;
protected BodyPart bodyAttach;
....
multipart = new MimeMultipart();
bodyText = new MimeBodyPart();
DataHandler data = new DataHandler(body, "text/html");
bodyText.setDataHandler(data);
multipart.addBodyPart(bodyText);

//file - сам вложенный файл
FileDataSource fds = new FileDataSource(file);  
MimetypesFileTypeMap ftm = new MimetypesFileTypeMap();
//mimeType - MIME-тип
ftm.addMimeTypes(mimeType);
fds.setFileTypeMap(ftm);
DataHandler attachData = new DataHandler(fds);
bodyAttach = new MimeBodyPart();
bodyAttach.setDataHandler(attachData);
//attachName - имя файла
bodyAttach.setFileName(attachName);
multipart.addBodyPart(bodyAttach);
     
message.setContent(multipart);
try {
    Transport.send(message);
}
....

Автор: LSD 2.4.2008, 12:59
Попробуй File.deleteOnExit().

Автор: cosmonaft 2.4.2008, 14:01
LSD, deleteOnExit() срабатывает во время завершения работы JVM? А если JVM будет работать без перезагрузок? Или завершит свою работу в результате ошибкия? 

Автор: LSD 2.4.2008, 14:14
Цитата(cosmonaft @  2.4.2008,  14:01 Найти цитируемый пост)
deleteOnExit() срабатывает во время завершения работы JVM?

Да.

Цитата(cosmonaft @  2.4.2008,  14:01 Найти цитируемый пост)
 А если JVM будет работать без перезагрузок? Или завершит свою работу в результате ошибкия?

Если JVM завершает работу в результате ошибке, то ничего нельзя сделать. Так же как и в случае зависания ОС, пропадания напряжения и т.п.
А так, унаследуйся от FileDataSource и в методе finalize() удаляй файл. Или создай некий Set куда дабавляй такие файлы, и пусть фоновый тред переодически пытается их удалить.

Автор: cosmonaft 2.4.2008, 14:25
Блин, проблема оказалась в незакрытом OutputStream... Код который выше, файл не лочит. 
LSD, спасибо за ответ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)