// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.vfs; import java.io.IOException; /** * File status: mode, mtime, size, etc. * * <p>The result of calling any {@code FileStatus} instance method is not * guaranteed to result in I/O to the file system at the moment of the call. * The I/O providing the result (and hence the throwing of an I/O exception, * where applicable) may occur at any moment between the call to {@link * FileSystem#stat} and the call of the {@code FileStatus} instance method. * * <p>Callers therefore cannot assume that all the values are populated * atomically, or that the results of any two {@code FileStatus} methods * correspond to state of the file system at a single moment in time. Nor may * they assume that repeated successful calls to any method of the same * instance will return the same value. * * <p>(This permits conforming implementations to use an atomic {@code stat(2)} * call on file systems where it is available, and individual accessor methods * on those where it is not. Caching is possible but not required.) */ public interface FileStatus { /** * Returns true iff this file is a regular file or {@code isSpecial()}. */ boolean isFile(); /** * Returns true iff this file is a directory. */ boolean isDirectory(); /** * Returns true iff this file is a symbolic link. */ boolean isSymbolicLink(); /** * Returns true iff this file is a special file (e.g. socket, fifo or device). {@link #getSize()} * can't be trusted for such files. */ boolean isSpecialFile(); /** * Returns the total size, in bytes, of this file. */ long getSize() throws IOException; /** * Returns the last modified time of this file's data (milliseconds since * UNIX epoch). * * TODO(bazel-team): Unix actually gives us nanosecond resolution for mtime and ctime. Consider * making use of this. */ long getLastModifiedTime() throws IOException; /** * Returns the last change time of this file, where change means any change * to the file, including metadata changes (milliseconds since UNIX epoch). */ long getLastChangeTime() throws IOException; /** * Returns the unique file node id. Usually it is computed using both device * and inode numbers. * * <p>Think of this value as a reference to the underlying inode. "mv"ing file a to file b * ought to cause the node ID of b to change, but appending / modifying b should not. */ long getNodeId() throws IOException; }