Simulieren Sie Berührungsbefehle mit Java

Lesezeit: 3 Minuten

Benutzer-Avatar
sinuhepop

Ich möchte den Änderungszeitstempel einer Binärdatei ändern. Was ist der beste Weg, dies zu tun?

Wäre das Öffnen und Schließen der Datei eine gute Option? (Ich benötige eine Lösung, bei der die Änderung des Zeitstempels auf jeder Plattform und JVM geändert wird).

  • Jemand sollte dies als Verbesserungsanfrage an unix4j senden: github.com/tools4j/unix4j

    – Sridhar Sarnobat

    21. Mai 2017 um 5:37 Uhr

  • Ich verstehe die Beziehung zwischen dem Titel und der Frage hier nicht?

    – Lealo

    28. September 2017 um 19:29 Uhr

  • @Lealo siehe Unix-Touch-Befehl

    – Grüner Riese

    9. Juli 2018 um 20:31 Uhr

  • Der Titel ist verwirrend, ebenso wie die akzeptierte Antwort. Berühren schafft eine Datei, falls sie nicht existiert. Der Titel sollte geändert werden.

    – Benutzer239558

    12. Juli 2018 um 8:22 Uhr

Benutzer-Avatar
Yishai

Die File-Klasse hat eine setLastModified Methode. Das macht ANT.

  • Abgesehen davon, dass es einen bekannten Android-Fehler gibt und File.setLastModified auf den meisten Android-Geräten nichts bewirkt.

    – Zeiger Null

    19. Dezember 2015 um 17:57 Uhr

  • Und außer Schale touch erstellt die Datei, und dies nicht.

    – Viktor Sergijenko

    7. August 2016 um 21:58 Uhr

Benutzer-Avatar
Mmmh mmh

Meine 2 Cent, basierend auf der Antwort von @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);
}

Benutzer-Avatar
sdgfsdh

Seit File ist eine schlechte Abstraktion, es ist besser zu verwenden Files und Path:

public static void touch(final Path path) throws IOException {
    Objects.requireNonNull(path, "path is null");
    if (Files.exists(path)) {
        Files.setLastModifiedTime(path, FileTime.from(Instant.now()));
    } else {
        Files.createFile(path);
    }
}

Hier ist ein einfacher Ausschnitt:

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

Benutzer-Avatar
VonC

Ich weiss Apache-Ameise hat ein Aufgabe was genau das tut.
Siehe die Quellcode von Touch (die Ihnen zeigen können, wie sie es tun)

Sie benutzen FILE_UTILS.setFileLastModified(file, modTime);die verwendet ResourceUtils.setLastModified(new FileResource(file), time);die a verwendet org.apache.tools.ant.types.resources.Touchableumgesetzt von org.apache.tools.ant.types.resources.FileResource

Im Grunde ist es ein Anruf File.setLastModified(modTime).

Benutzer-Avatar
Raeky

Diese Frage erwähnt nur die Aktualisierung des Zeitstempels, aber ich dachte, ich würde das trotzdem hier einfügen. Ich habe nach Touch wie in Unix gesucht, das auch eine Datei erstellt, wenn sie nicht existiert.

Für alle, die Apache Commons verwenden, gibt es FileUtils.touch(File file) das tut genau das.

Hier ist die Quelle von (eingebunden 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);
    }
}

Benutzer-Avatar
Joe23

Wenn Sie bereits verwenden Guave:

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

1055490cookie-checkSimulieren Sie Berührungsbefehle mit Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy