@Restricted(NoExternalUse.class) public static boolean isSymlink(@Nonnull Path path) { /* * Windows Directory Junctions are effectively the same as Linux symlinks to directories. * Unfortunately, the Java 7 NIO2 API function isSymbolicLink does not treat them as such. * It thinks of them as normal directories. To use the NIO2 API & treat it like a symlink, * you have to go through BasicFileAttributes and do the following check: * isSymbolicLink() || isOther() * The isOther() call will include Windows reparse points, of which a directory junction is. * It also includes includes devices, but reading the attributes of a device with NIO fails * or returns false for isOther(). (i.e. named pipes such as \\.\pipe\JenkinsTestPipe return * false for isOther(), and drives such as \\.\PhysicalDrive0 throw an exception when * calling readAttributes. */ try { BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); return attrs.isSymbolicLink() || (attrs instanceof DosFileAttributes && attrs.isOther()); } catch (IOException ignored) { return false; } }
public FilePropsImpl(BasicFileAttributes attrs) { creationTime = attrs.creationTime().toMillis(); lastModifiedTime = attrs.lastModifiedTime().toMillis(); lastAccessTime = attrs.lastAccessTime().toMillis(); isDirectory = attrs.isDirectory(); isOther = attrs.isOther(); isRegularFile = attrs.isRegularFile(); isSymbolicLink = attrs.isSymbolicLink(); size = attrs.size(); }
Path file = ...; BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); System.out.println("creationTime: " + attr.creationTime()); System.out.println("lastAccessTime: " + attr.lastAccessTime()); System.out.println("lastModifiedTime: " + attr.lastModifiedTime()); System.out.println("isDirectory: " + attr.isDirectory()); System.out.println("isOther: " + attr.isOther()); System.out.println("isRegularFile: " + attr.isRegularFile()); System.out.println("isSymbolicLink: " + attr.isSymbolicLink()); System.out.println("size: " + attr.size());
public FilePropsImpl(BasicFileAttributes attrs) { creationTime = attrs.creationTime().toMillis(); lastModifiedTime = attrs.lastModifiedTime().toMillis(); lastAccessTime = attrs.lastAccessTime().toMillis(); isDirectory = attrs.isDirectory(); isOther = attrs.isOther(); isRegularFile = attrs.isRegularFile(); isSymbolicLink = attrs.isSymbolicLink(); size = attrs.size(); }
@Override public boolean isOther() { return this.delegate.isOther(); }
@Override public boolean isOther() { return host.isOther(); }
@Override public Object readAttribute(AttributeReadContext context) throws IOException { return context.getBasicFileAttributes().isOther(); }
@Override public boolean isOther(File file) { final BasicFileAttributes atts = getBasicFileAttributes(file); return atts != null ? atts.isOther() : super.isOther(file); } }
@Override public boolean isOther(File file) { final BasicFileAttributes atts = getBasicFileAttributes(file); return atts != null ? atts.isOther() : super.isOther(file); } }
/** * this is the TMM variant of isRegularFiles()<br> * because deduplication creates windows junction points, we check here if it is<br> * not a directory, and either a regular file or "other" one.<br> * see http://serverfault.com/a/667220 * * @param file * @return */ public static boolean isRegularFile(Path file) { // see windows impl http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/nio/fs/WindowsFileAttributes.java#451 try { BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); return (attr.isRegularFile() || attr.isOther()) && !attr.isDirectory(); } catch (IOException e) { return false; } }
/** * this is the TMM variant of isRegularFiles()<br> * because deduplication creates windows junction points, we check here if it is<br> * not a directory, and either a regular file or "other" one.<br> * see http://serverfault.com/a/667220 * * @param attr * @return */ public static boolean isRegularFile(BasicFileAttributes attr) { // see windows impl http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/nio/fs/WindowsFileAttributes.java#451 return (attr.isRegularFile() || attr.isOther()) && !attr.isDirectory(); }
public static String toString(BasicFileAttributes a) { StringBuilder result = new StringBuilder(); result.append("(creationTime="); result.append(a.creationTime()); result.append(",fileKey="); result.append(a.fileKey()); result.append(",isDirectory="); result.append(a.isDirectory()); result.append(",isOther="); result.append(a.isOther()); result.append(",isRegularFile="); result.append(a.isRegularFile()); result.append(",isSymbolicLink="); result.append(a.isSymbolicLink()); result.append(",lastAccessTime="); result.append(a.lastAccessTime()); result.append(",lastModifiedTime="); result.append(a.lastModifiedTime()); result.append(",size="); result.append(a.size()); result.append(")"); return result.toString(); } }
public FileProps(BasicFileAttributes attrs) { creationTime = new Date(attrs.creationTime().toMillis()); lastModifiedTime = new Date(attrs.lastModifiedTime().toMillis()); lastAccessTime = new Date(attrs.lastAccessTime().toMillis()); isDirectory = attrs.isDirectory(); isOther = attrs.isOther(); isRegularFile = attrs.isRegularFile(); isSymbolicLink = attrs.isSymbolicLink(); size = attrs.size(); } }
/** * Given a BasicFileAttributes not null then return a Map * with the keys as the fields of the BasicFileAttributes or PosixFileAttributes and the values * with the content of the fields * * @param attr BasicFileAttributes * @return Map String Object never null */ public static Map<String, Object> fileAttributeToMap(BasicFileAttributes attr) { Map<String, Object> result = new HashMap<>(); result.put("creationTime", attr.creationTime()); result.put("fileKey", attr.fileKey()); result.put("isDirectory", attr.isDirectory()); result.put("isOther", attr.isOther()); result.put("isRegularFile", attr.isRegularFile()); result.put("isSymbolicLink", attr.isSymbolicLink()); result.put("lastAccessTime", attr.lastAccessTime()); result.put("lastModifiedTime", attr.lastModifiedTime()); result.put("size", attr.size()); if (attr instanceof PosixFileAttributes) { PosixFileAttributes posixAttr = (PosixFileAttributes) attr; result.put("permissions", posixAttr.permissions()); result.put("owner", posixAttr.owner()); result.put("group", posixAttr.group()); } return result; }
@Override public final Set<Type> getTypes() { try { final BasicFileAttributes attr = readBasicFileAttributes(); if (attr.isRegularFile()) return FILE_TYPE_SET; else if (attr.isDirectory()) return DIRECTORY_TYPE_SET; else if (attr.isSymbolicLink()) return SYMLINK_TYPE_SET; else if (attr.isOther()) return SPECIAL_TYPE_SET; } catch (IOException ignore) { // This doesn't exist or may be inaccessible. In either case... } return Collections.emptySet(); }
@Override public final BitField<Type> getTypes() { try { final BasicFileAttributes attr = readBasicFileAttributes(); if (attr.isRegularFile()) return FILE_TYPE; else if (attr.isDirectory()) return DIRECTORY_TYPE; else if (attr.isSymbolicLink()) return SYMLINK_TYPE; else if (attr.isOther()) return SPECIAL_TYPE; } catch (IOException ignore) { // This doesn't exist or may be inaccessible. In either case... } return NO_TYPES; }
public Builder copy(BasicFileAttributes attributes) { withCreated(attributes.creationTime().toMillis()); withLastAccessed(attributes.lastAccessTime().toMillis()); withLastModified(attributes.lastModifiedTime().toMillis()); withDirectory(attributes.isDirectory()); withOther(attributes.isOther()); withRegularFile(attributes.isRegularFile()); withSize(attributes.size()); withSymbolicLink(attributes.isSymbolicLink()); withFileKey(fromNullable(attributes.fileKey())); return this; }
@Override public final boolean isType(final Type type) { try { switch (type) { case FILE: return readBasicFileAttributes().isRegularFile(); case DIRECTORY: return readBasicFileAttributes().isDirectory(); case SYMLINK: return readBasicFileAttributes().isSymbolicLink(); case SPECIAL: return readBasicFileAttributes().isOther(); } } catch (IOException ignored) { } return false; }
@Override public final boolean isType(final Type type) { try { switch (type) { case FILE: return readBasicFileAttributes().isRegularFile(); case DIRECTORY: return readBasicFileAttributes().isDirectory(); case SYMLINK: return readBasicFileAttributes().isSymbolicLink(); case SPECIAL: return readBasicFileAttributes().isOther(); } } catch (IOException ignored) { } return false; }
public static boolean equalsIgnoreLastAccessTime(BasicFileAttributes a, BasicFileAttributes b) { if(a == b) return true; if(a == null || b == null) return false; if(!a.creationTime().equals(b.creationTime())) return false; if(!Objects.equals(a.fileKey(), b.fileKey())) return false; if(a.isDirectory() != b.isDirectory()) return false; if(a.isOther() != b.isOther()) return false; if(a.isRegularFile() != b.isRegularFile()) return false; if(a.isSymbolicLink() != b.isSymbolicLink()) return false; if(!a.lastModifiedTime().equals(b.lastModifiedTime())) return false; if(a.size() != b.size()) return false; return true; }