Я пытаюсь программно очистить файлы журналов из запущенной (!) Системы, состоящей из нескольких серверов Java и не-Java. Я использовал функцию File.delete() Java и обычно работает нормально. Я также прекрасно разбираюсь в том, что файлы журнала, которые в настоящее время используются, не удаляются, поэтому я просто регистрирую его как предупреждение, когда File.delete() возвращает false.Файл Java File.delete() иногда оставляет недоступные файлы (Windows)
Однако в файлах журналов, которые в настоящее время все еще записываются приложениями NON-Java (Postgres, Apache HTTPD и т. Д., Приложения Java также могут быть затронуты, но я еще не заметил, и все они используют то же самое (в любом случае, это похоже на ОК) на самом деле не удалены (это то, что я ожидал), однако File.delete() возвращает «true» для них. Но эти файлы не только сохраняются в файловой системе (Windows explorer и «dir» все еще показывают их), но потом они недоступны ... когда я пытаюсь открыть их с помощью текстового редактора и т. Д. Я получаю «доступ запрещен» »или аналогичные сообщения об ошибках, когда я пытаюсь скопировать их с помощью explorer, он также утверждает, что у меня нет разрешений, когда я проверяю его« свойства »с помощью explorer, он дает мне« У вас нет разрешения на просмотр или редактирование этого объекта разрешения».
Просто, чтобы быть ясным: до того, как я запустил операцию File.delete(), я мог без проблем получить или удалить эти файлы, операция удаления «разрывает» их. Как только я остановлю приложение, файл исчезнет, и при перезапуске приложение создаст его с нуля, и все вернется к норме. Проблема заключается в том, что при повторном запуске приложения после операции очистки файла журнала приложение регистрируется в нирване.
Это поведение немного напоминает поведение файлов Linux: если вы удаляете файл, который все еще остается открытым приложением, он исчезает из файловой системы, но приложение, все еще содержащее дескриптор файла, будет счастливо продолжайте писать в этот файл, но после этого вы никогда не сможете получить к нему доступ. Единственное различие заключается в том, что здесь файлы все еще видны в FS, но также недоступны в противном случае.
Следует отметить, что как моя программа Java, так и сами приложения работают с пользователем системы.
Я также пробовал Files.delete(), который, как утверждается, генерирует IOException, указывающий на ошибку ... но кажется, что ошибок нет.
Что я пытался решить проблему, это проверить, заблокированы ли файлы в данный момент, используя метод, описанный здесь https://stackoverflow.com/a/1390669/5837050, но это работает только для некоторых файлов, а не для всех.
Мне в основном нужен надежный способ (по крайней мере для Windows, если он работал и для Linux, это было бы замечательно), чтобы определить, используется ли какой-либо файл какой-либо программой, поэтому я просто не мог его удалить.
Любые намеки приветствуются.
@ Divyesh: Введенная вами ссылка вводит общие функции параллелизма Java - не знаю, как они должны здесь помочь, поскольку файлы, которые я хочу удалить, на самом деле даже не написаны моим собственным приложением Java, а различными сторонними Java и Приложения NON-Java. – MellowCoder