Как определить возможность чтения/переименования/перемещения файла и его права доступа в Java?
Имеется сервис/thread worker, который с заданной периодичностью ищет файл/-ы в определённой директории/-ях для извлечения из них данных и перемещения прочитанных файлов в директорию/архив. Исходные файлы создаются сторонними сервисами и изменить их (сервисы) не представляется возможным. В некоторых случаях имена файлов содержат текущую метку времени и при взаимодействии с файлом можно быть уверенным в том, что в момент чтения/переименования/перемещения файла сторонний сервис не будет пытаться его перезаписать. Но в некоторых случаях имя файла статическое и в момент чтения/переименования/перемещения такого файла сторонний сервис может пытаться перезаписать файл. Во избежании такой ситуации было принято решение переименовывать файл добавляя к его имени расширение ".tmp". Хоть это и позволило исключить некоторые возможные проблемы, но не все. Так как файлы создаются сторонними сервисами они могут иметь разные права доступа, которые не понятно как проверить. Далее конкретный пример:
File[] _files = getFiles();
for(int i = 0; i < _files.length; i++)
{
File _file = rename( _files[i], _files[i].getName() + ".tmp" );
}
// ....
private static File rename(File file, String fileName) throws IOException
{
Path _filePath = file.toPath();
Path _targetPath = Files.move(
_filePath,
_filePath.resolveSibling( fileName ),
StandardCopyOption.REPLACE_EXISTING
);
return _targetPath.toFile();
}
Файл/-ы физически на диске присутствуют, но при попытке переименовать метод rename (Files.move) выбрасывает исключение java.nio.file.NoSuchFileException:
java.nio.file.NoSuchFileException: c:\a\b\c.d
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:326)
at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:288)
at java.base/java.nio.file.Files.move(Files.java:1421)
at xxx.xxxxx.xxxxx.xxxxx.rename(XxxxXxxxx.java:42)
На локальной машине всё работает должным образом. Из всего этого делаю вывод, что у файла какие-то особенные права доступа, но каким образом их проверить? Как определить права доступа, возможность записи/переименования/перемещения файла?