Идентификатор файла для отслеживания изменений файла в Java? - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь найти способ отслеживать файлы, даже когда они перемещаются или переименовываются в файловой системе.

Одна из моих идей заключалась в том, чтобы использовать новый UserDefinedFileAttributeView в Java 7 и создатьнастраиваемый атрибут файла как своего рода идентификатор.Я думал, что это может работать на разных платформах (прежде всего, Windows и Mac).Но я не могу заставить его работать.Даже пробуя пример на этой странице - http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html - Когда я попадаю в эту строку:

Представление UserDefinedFileAttributeView = Files.getFileAttributeView (file, UserDefinedFileAttributeView.class);

Я толькополучить нулевое значение для переменной представления, а затем программа останавливается с исключением nullpointer.

Затем я обнаружил, что, по крайней мере, существует более простой способ сделать это для Mac: использовать атрибут fileFey BasicFileAttributes.Я попробовал это, и fileKey, кажется, остался прежним, даже если я переместил файл или переименовал его.Тем не менее, он также говорит, что эта функциональность зависит от платформы, и я помню, как где-то читал, что она не работает в Windows ...

Итак, прежде всего, является ли метод fileKey стабильным способом сделать это наMac?И если так, что я могу сделать для той же функциональности для Windows?Кто-нибудь знает, почему я получаю значение NULL в UserDefinedFileAttributeView?Потому что, если бы я мог заставить это работать, я думаю, это должно быть кроссплатформенным.

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

Ответы [ 2 ]

0 голосов
/ 17 марта 2015

Это не реализовано в OSX-версии Java.Эта ошибка все еще открыта: https://bugs.openjdk.java.net/browse/JDK-8030048

Эта ошибка была закрыта, https://bugs.openjdk.java.net/browse/JDK-8040830, со ссылкой на стороннее решение (которое я не пробовал): https://github.com/IsNull/xattrj

0 голосов
/ 10 декабря 2011

Я попробовал пример Oracle на компьютере с Windows XP. В примере кода была очень незначительная ошибка, но кроме этого, код работал нормально - по крайней мере, в Windows XP. Надеюсь, это также будет работать на Linux и т. Д., Но я лично пробовал только на Windows XP.

public static void main(String args[])
        throws Exception
{
    Path target = Paths.get("C:\\mytemp\\Something.txt");
    Files.createFile(target);
    UserDefinedFileAttributeView view = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    view.write("user.mimetype", Charset.defaultCharset().encode("text/html"));
    String name = "user.mimetype";
    ByteBuffer buf = ByteBuffer.allocate(view.size(name));
    view.read(name, buf);
    buf.flip();
    String value = Charset.defaultCharset().decode(buf).toString();
    System.out.println("value="+value);

Чтобы убедиться, что атрибут не просто читается из представления, я также запустил тот же код, используя второе представление. Это также сработало ...

public static void main(String args[])
        throws Exception
{
    Path target = Paths.get("C:\\mytemp\\SomethingDifferent.txt");
    Files.createFile(target);
    UserDefinedFileAttributeView view = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    view.write("user.mimetype", Charset.defaultCharset().encode("text/html"));
    String name = "user.mimetype";

    UserDefinedFileAttributeView view2 = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    ByteBuffer buf = ByteBuffer.allocate(view2.size(name));
    view2.read(name, buf);
    buf.flip();
    String value = Charset.defaultCharset().decode(buf).toString();
    System.out.println("value="+value);


}

Было бы замечательно, если бы такие пользовательские атрибуты файлов работали на всех основных платформах, поскольку такие пользовательские атрибуты файлов невероятно удобны в некоторых ситуациях. Надеюсь, что они делают.

...