Question

Je souhaite modifier l'horodatage de modification d'un fichier binaire. Quel est le meilleur moyen de le faire?

L'ouverture et la fermeture du fichier seraient-elles une bonne option? (J'ai besoin d'une solution dans laquelle la modification de l'horodatage sera modifiée sur chaque plate-forme et machine virtuelle).

Était-ce utile?

La solution

La classe File a un méthode setLastModified . C’est ce que fait ANT.

Autres conseils

Mes 2 cents, d'après la réponse de Joe.M

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);
}

Voici un extrait simple:

void touch(File file, long timestamp)
{
    try
    {
        if (!file.exists())
            new FileOutputStream(file).close();
        file.setLastModified(timestamp);
    }
    catch (IOException e)
    {
    }
}

Je sais que Apache Ant a un Tâche qui ne fait que cela.
Voir le code source de Touch (qui peut vous montrer comment ils le font)

Ils utilisent FILE_UTILS .setFileLastModified (file, modTime); , qui utilise ResourceUtils.setLastModified (nouveau FileResource (fichier), heure); , qui utilise un org.apache.tools.ant.types.resources.Touchable / a>, mis en œuvre par < code> org.apache.tools.ant.types.resources.FileResource ...

En gros, il s'agit d'un appel à File.setLastModified (modTime) .

Cette question ne mentionne que la mise à jour de l'horodatage, mais je pensais l'inclure ici de toute façon. Je cherchais un toucher comme sous Unix qui créera également un fichier s’il n’existe pas.

Pour ceux qui utilisent Apache Commons, il y a FileUtils.touch (fichier fichier) qui fait exactement cela.

Voici le source à partir de ( inséré> openInputStream (fichier 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);
    }
}

Si vous utilisez déjà Goyave :

com.google.common.io.Files.touch (fichier)

Puisque Fichier est une mauvaise abstraction , il vaut mieux utiliser Fichiers et Chemin :

public static void touch(final Path path) throws IOException {
    Objects.requireNotNull(path, "path is null");
    if (Files.exists(path)) {
        Files.setLastModifiedTime(path, FileTime.from(Instant.now()));
    } else {
        Files.createFile(path);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top