javafileiojimfs

Set last modified timestamp of a file using jimfs in Java


How can I set a last modified date of a file using jimfs? I have smth. like this:

final FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix());
Path rootPath = Files.createDirectories(fileSystem.getPath("root/path/to/directory"));
Path filePath = rootPath.resolve("test1.pdf");
Path anotherFilePath = rootPath.resolve("test2.pdf");

After creating the stuff I then create a directory iterator like:

try (final DirectoryStream<Path> dirStream = Files.newDirectoryStream(rootPath, "*.pdf")) {
 final Iterator<Path> pathIterator = dirStream.iterator();
}

After that I iterate over the files and read the last modified file, which I then return:

Path resolveLastModified(Iterator<Path> dirStreamIterator){
    long lastModified = Long.MIN_VALUE;
    File lastModifiedFile = null;
    while (dirStreamIterator.hasNext()) {
        File file = new File(dirStreamIterator.next().toString());
        final long actualLastModified = file.lastModified();
        if (actualLastModified > lastModified) {
            lastModifiedFile = file;
            lastModified = actualLastModified;
        }
    }
    return lastModifiedFile.toPath();
}

The problem is that both files "test1.pdf" and "test2.pdf" have lastModified being "0" so I actually can't really test the behavior as the method would always return the first file in the directory. I tried doing:

File file = new File(filePath.toString());
file.setLastModified(1);

but the method returns false.

UDPATE

I just saw that File#getLastModified() uses the default file system. This means that the default local file system will be used to read the time stamp. And this means I am not able to create a temp file using Jimfs, read the last modified and then assert the paths of those files. The one will have jimfs:// as uri scheme and the another will have OS dependent scheme.


Solution

  • Jimfs uses the Java 7 file API. It doesn't really mix with the old File API, as File objects are always tied to the default file system. So don't use File.

    If you have a Path, you should use the java.nio.file.Files class for most operations on it. In this case, you just need to use

    Files.setLastModifiedTime(path, FileTime.fromMillis(millis));