Reputation: 20326
I want to change modification timestamp of a binary file. What is the best way for doing this?
Would opening and closing the file be a good option? (I require a solution where the modification of the timestamp will be changed on every platform and JVM).
Upvotes: 65
Views: 45549
Reputation: 37095
Since File
is a bad abstraction, it is better to use Files
and Path
:
public static void touch(final Path path) throws IOException {
Objects.requireNonNull(path, "path is null");
try {
Files.createFile(path);
} catch (FileAlreadyExistsException e) {
Files.setLastModifiedTime(path, FileTime.from(Instant.now()));
}
}
Upvotes: 18
Reputation: 5782
If you are already using Guava:
com.google.common.io.Files.touch(file)
Upvotes: 6
Reputation: 5470
My 2 cents, based on @Joe.M answer
public static void touch(File file) throws IOException{
long timestamp = System.currentTimeMillis();
touch(file, timestamp);
}
public static void touch(File file, long timestamp) throws IOException{
if (!file.exists()) {
new FileOutputStream(file).close();
}
file.setLastModified(timestamp);
}
Upvotes: 30
Reputation: 91911
The File class has a setLastModified method. That is what ANT does.
Upvotes: 50
Reputation: 5131
This question only mentions updating the timestamp, but I thought I'd put this in here anyways. I was looking for touch like in Unix which will also create a file if it doesn't exist.
For anyone using Apache Commons, there's FileUtils.touch(File file)
that does just that.
Here's the source from (inlined openInputStream(File f)
):
public static void touch(final File file) throws IOException {
if (file.exists()) {
if (file.isDirectory()) {
throw new IOException("File '" + file + "' exists but is a directory");
}
if (file.canWrite() == false) {
throw new IOException("File '" + file + "' cannot be written to");
}
} else {
final File parent = file.getParentFile();
if (parent != null) {
if (!parent.mkdirs() && !parent.isDirectory()) {
throw new IOException("Directory '" + parent + "' could not be created");
}
}
final OutputStream out = new FileOutputStream(file);
IOUtils.closeQuietly(out);
}
final boolean success = file.setLastModified(System.currentTimeMillis());
if (!success) {
throw new IOException("Unable to set the last modification time for " + file);
}
}
Upvotes: 6
Reputation: 2237
Here's a simple snippet:
void touch(File file, long timestamp)
{
try
{
if (!file.exists())
new FileOutputStream(file).close();
file.setLastModified(timestamp);
}
catch (IOException e)
{
}
}
Upvotes: 12
Reputation: 1326852
I know Apache Ant has a Task which does just that.
See the source code of Touch (which can show you how they do it)
They use FILE_UTILS.setFileLastModified(file, modTime);
, which uses ResourceUtils.setLastModified(new FileResource(file), time);
, which uses a org.apache.tools.ant.types.resources.Touchable
, implemented by org.apache.tools.ant.types.resources.FileResource
...
Basically, it is a call to File.setLastModified(modTime)
.
Upvotes: 8