Java: проверить, может ли файл быть перемещен под Windows - PullRequest
0 голосов
/ 19 марта 2012

Мне нужно переименовать файл (держа его в том же каталоге);Кажется, я не могу найти способ проверить, есть ли у моей программы необходимые разрешения:

Files.isWritable(directory) && Files.isWritable(oldFile);

всегда возвращает true, независимо от того, есть ли у запущенного пользователя разрешение на запись файла (полагаю, они толькопроверить, доступен ли файл только для чтения, даже если это нарушает договор, указанный в javadoc);Я не работаю в диспетчере безопасности, поэтому я не могу позвонить

System.getSecurityManager.checkDelete(oldFile.toString());

Мне нужно проверить, будет ли (возможно) переименование нескольких файлов успешным, поэтому я не могу просто попытаться поймать исключение,Есть ли выход?Очевидно, что портативное решение было бы привлекательным, но я бы остановился на конкретном для Windows ...

Ответы [ 3 ]

1 голос
/ 19 марта 2012

Ну, вы не можете проверить Windows ACL таким образом.«Собственное» решение довольно простое, поскольку Windows поддерживает транзакции в файловой системе.Просто позвоните по номеру DeleteFileTransacted и откатите транзакцию в случае неудачного удаления.

Если вы не используете транзакции, то второй вариант - сначала открыть дескрипторы с явным DELETE желаемым доступом (DELETE является одним из стандартных прав доступа WinNT), запрещая любой обмен.Если и только если это удастся для всех файлов, удалите их все с помощью SetFileInformationByHandle(handle, FileDispositionInfo, &fdiObj, sizeof(fdiObj));

(последняя не является транзакцией и в результате может иметь проблемы с изоляцией, которые, в свою очередь, влияют на атомарность).

0 голосов
/ 20 марта 2012

Просто попробуйте переместить это! Если перемещение не удалось, у вас не было разрешений или что-то еще пошло не так.

Это общий принцип. Не пытайтесь предсказать будущее, угадывая, будет ли предстоящая операция успешной. Попробуйте операцию. В противном случае вы вводите все виды дополнительных проблем:

  1. Вы можете сделать неправильный тест.
  2. Условие может измениться между тестом и операцией.
  3. Операция обычно возвращает ошибку или в любом случае выдает исключение, которое вы должны написать для обработки кода: зачем писать все дважды?
0 голосов
/ 19 марта 2012

Попробуйте new SecurityManager().checkDelete(oldFile.toString()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...