سؤال

وأريد تغيير الطابع الزمني تعديل ملف ثنائي. ما هي أفضل طريقة للقيام بذلك؟

وإن فتح وإغلاق ملف يكون خيارا جيدا؟ (I تتطلب حلا حيث سيتم تغيير تعديل الطابع الزمني على كل منصة وJVM).

هل كانت مفيدة؟

المحلول

والطبقة الملف لديها <لأ href = "http://docs.oracle.com/javase/7/docs/api/java/io/File.html#setLastModified٪28long٪29" يختلط = "noreferrer" > setLastModified الأسلوب. هذا هو ما ANT لا.

نصائح أخرى

وبلدي 2 سنتا، استنادا إلى @ 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);
}

وهنا مقتطف بسيط:

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

وأنا أعلم أباتشي النملة لها <لأ href = "http://ant.apache.org/ دليل / المهام / touch.html "يختلط =" noreferrer "> العمل الذي يفعل ذلك بالضبط.
انظر شفرة المصدر اللمس (والتي يمكن أن تظهر لك كيف تفعل ذلك)

FILE_UTILS.setFileLastModified(file, modTime); ، والذي يستخدم ResourceUtils.setLastModified(new FileResource(file), time); ، التي يستخدم org.apache.tools.ant.types.resources.Touchable الذي تنفذه org.apache.tools.ant.types.resources.FileResource ...

وفي الأساس، بل هو دعوة إلى File.setLastModified(modTime).

وهذا السؤال يذكر فقط تحديث الطابع الزمني، ولكنني اعتقدت أن وضع هذا هنا على أي حال. كنت أبحث عن لمسة في مثل يونكس والتي سوف أيضا إنشاء ملف إذا لم يكن موجودا.

لأي شخص باستخدام أباتشي العموم، هناك <لأ href = "http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#touch٪28java.io .File٪ 29 "يختلط =" noreferrer "> FileUtils.touch(File file) ان يفعل ذلك بالضبط.

وهنا في مصدر من (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);
    }
}

إذا كنت تستخدم بالفعل الجوافة :

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

ومنذ File و تجريد سيئة ، فمن الأفضل ل استخدام Files وPath:

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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top