代码之家  ›  专栏  ›  技术社区  ›  sinuhepop

用Java模拟触摸命令

  •  45
  • sinuhepop  · 技术社区  · 15 年前

    我想更改二进制文件的修改时间戳。最好的方法是什么?

    打开和关闭文件是一个好的选择吗?(我需要一个解决方案,其中时间戳的修改将在每个平台和JVM上更改)。

    7 回复  |  直到 7 年前
        1
  •  43
  •   Mmmh mmh    10 年前

    文件类有一个 setLastModified 方法。蚂蚁就是这样做的。

        2
  •  19
  •   Community Dunja Lalic    7 年前

    我的2美分,根据 @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);
    }
    
        3
  •  10
  •   Zach-M    11 年前

    下面是一个简单的片段:

    void touch(File file, long timestamp)
    {
        try
        {
            if (!file.exists())
                new FileOutputStream(file).close();
            file.setLastModified(timestamp);
        }
        catch (IOException e)
        {
        }
    }
    
        4
  •  8
  •   martin clayton egrunin    14 年前

    我知道 Apache Ant 有一个 Task 就是这样。
    source code of Touch (这可以告诉你他们是怎么做的)

    他们使用 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) .

        5
  •  6
  •   Raekye    11 年前

    这个问题只提到更新时间戳,但我想我无论如何都会把它放在这里。我在Unix中寻找touch-like,如果它不存在,它也会创建一个文件。

    对于任何使用ApacheCommons的人来说, FileUtils.touch(File file) 就是这样。

    这里是 source 从(内联) 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);
        }
    }
    
        6
  •  5
  •   Joe23    9 年前

    如果您已经在使用 Guava :

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

        7
  •  2
  •   sdgfsdh    7 年前

    自从 File a bad abstraction ,最好用 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);
        }
    }