РЕДАКТИРОВАТЬ: точность для Windows (спасибо pingw33n)
Совершенно нормально, что вы не получаете Exception
, когда:
- вы открываете файл
- вы или кто-то другой удаляет файл
- вы по-прежнему имеете доступ к файлу, читаете его содержимое перед удалением или записываете в него
На самом деле удаление файла ничего не делает с самим файлом. То, что удаляется, является записью в каталоге. И файл будет фактически уничтожен (и секторы, которые он использует на диске, будут освобождены) только тогда, когда:
- больше никакие записи каталога не указывают на него
- никакие файловые дескрипторы не удерживают его открытым
Таким образом, даже если байт, который вы запрашиваете, не буферизован в памяти, файловая система все равно знает, как получить его с диска. Кстати, это общий шаблон для создания временных файлов, то есть файлов, которые будут удалены при последнем закрытии.
Конечно, вы можете сделать то, что предлагает merlin2011, то есть проверить наличие файла через его путь. Но вы должны знать, что файл удаляется, а затем создается снова, путь (который использовался для открытия файла) присутствует, но указывает на совершенно другой объект.
Поэтому, если вам действительно нужно, чтобы файл действительно отражал содержимое каталога, вы не можете держать его открытым и должны открывать его при каждом доступе... Это нечестный вариант, который вы все равно можете:
- игнорировать изменения в каталоге и файловой системе; у вас есть файл, и вы его используете, и точка. Есть много случаев использования, когда это правильно.
- укажите в своей документации, что каталог принадлежит вам и никто другой не должен удалять в нем файл. И в конце концов, вы не можете помешать администратору сломать его систему или убить ваше приложение.
Это верно для всех обычных файловых систем, всех систем Linux или других Unix, таких как системы, NTFS и т. д. Я не уверен, что это верно для более старых, таких как CPM или FAT, но в настоящее время они больше не используются в производстве. :-). Но в Windows не должно быть возможности удалить файл, открытый в настоящее время в приложении Java.
Чтобы точно ответить вам на 2 вопроса:
- ваш указатель не болтается, но все еще указывает на реальный файл (даже если никто другой его не видит)
- Исключение будет выдано в случае недоступности файла (физическое повреждение диска или соединений, ошибки файловой системы и т.д.). Но если только запись была удалена, файл все еще доступен
person
Serge Ballesta
schedule
17.06.2014