Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Uniquely identify file in Java

Tags:

java

file

jvm

nio

Im on Linux and my Java application is not intended to be portable.

I'm looking for a way to identify a file uniquely in Java. I can make use of statfs syscall since the pair (f_fsid, ino) uniquely identifies a file (not only across a file system) as specified here: http://man7.org/linux/man-pages/man2/statfs.2.html

The question is if it is possible extract fsid from Java directly so I can avoid writing JNI function?

inode can be extracted with NIO, but how about fsid? inode and fsid comes from different structure and are operated by different syscalls...

like image 842
Some Name Avatar asked Dec 26 '18 18:12

Some Name


People also ask

What are the types of identifiers in Java?

In Java, an identifier can be a class name, method name, variable name, or label. For example : In the above java code, we have 5 identifiers namely : Test : class name. main : method name. String : predefined class name.

How to find unique elements from an array in Java?

In Java, there is more than one way to find unique elements from an array which are as follows: By storing all the elements to the hashmap's key. By using nested loop.

How do I detect file types in Java?

There are third-party libraries that can also be used to detect file types in Java. One example is Apache Tika, a "content analysis toolkit" that "detects and extracts metadata and text from over a thousand different file types." In this post, I look at using Tika's facade class and its detect (String) method to detect file types.

How to check a file is hidden or not in Java?

We can check a file is hidden or not in Java using isHidden () method of File class in Java. This method returns a boolean value – true or false. The precise definition of hidden is platform or provider dependent.


2 Answers

This java example demonstrates how to get the unix inode number of a file.

import java.nio.file.*;
import java.nio.file.attribute.*;

public class MyFile {

  public static void main(String[] args) throws Exception  {

    BasicFileAttributes attr = null;
    Path path = Paths.get("MyFile.java");

    attr = Files.readAttributes(path, BasicFileAttributes.class);

    Object fileKey = attr.fileKey();
    String s = fileKey.toString();
    String inode = s.substring(s.indexOf("ino=") + 4, s.indexOf(")"));
    System.out.println("Inode: " + inode);
  }
}

The output

$ java MyFile
Inode: 664938

$ ls -i MyFile.java 
664938 MyFile.java

credit where credit is due: https://www.javacodex.com/More-Examples/1/8

like image 99
HairOfTheDog Avatar answered Oct 10 '22 05:10

HairOfTheDog


I would suggest the GIT method of hashing the file contents. This is proof against copying and renaming.

Java is supposed to be platform independent so using Unix specific methods may not be what you want.

like image 2
Jonathan Rosenne Avatar answered Oct 10 '22 03:10

Jonathan Rosenne