Don't miss Win32FsCache

This commit is contained in:
Roman Shevchenko
2012-08-30 10:34:41 +04:00
parent b2ddcc721d
commit b99feb74c5
4 changed files with 38 additions and 70 deletions
@@ -61,15 +61,16 @@ class Win32FsCache {
List<String> names = new ArrayList<String>(fileInfo.length);
Map<String, FileInfo> map = getMap();
for (FileInfo info : fileInfo) {
if (info.name.equals(".")) {
String name = info.getName();
if (name.equals(".")) {
map.put(absolutePath, info);
continue;
}
if (info.name.equals("..")) {
if (name.equals("..")) {
continue;
}
map.put(absolutePath + "/" + info.name, info);
names.add(info.name);
map.put(absolutePath + "/" + name, info);
names.add(name);
}
return ArrayUtil.toStringArray(names);
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.vfs.impl.win32;
import com.intellij.openapi.util.io.FileAttributes;
import com.intellij.openapi.util.io.win32.FileInfo;
import com.intellij.openapi.util.io.win32.IdeaWin32;
import com.intellij.openapi.vfs.VirtualFile;
@@ -25,9 +26,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Set;
import static com.intellij.util.BitUtil.isSet;
import static com.intellij.util.BitUtil.notSet;
/**
* @author Dmitry Avdeev
*/
@@ -61,45 +59,9 @@ public class Win32LocalFileSystem extends LocalFileSystemBase {
}
@Override
public boolean exists(@NotNull VirtualFile file) {
if (file.getParent() == null) return true;
return myFsCache.getInfo(file) != null;
}
@Override
public boolean isDirectory(@NotNull VirtualFile file) {
public FileAttributes getAttributes(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DIRECTORY);
}
@Override
public boolean isWritable(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null && notSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_READONLY);
}
@Override
public boolean isSymLink(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_REPARSE_POINT);
}
@Override
public boolean isSpecialFile(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DEVICE);
}
@Override
public long getTimeStamp(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null ? fileInfo.getTimestamp() : DEFAULT_TIMESTAMP;
}
@Override
public long getLength(@NotNull VirtualFile file) {
final FileInfo fileInfo = myFsCache.getInfo(file);
return fileInfo != null ? fileInfo.length : DEFAULT_LENGTH;
return fileInfo != null ? fileInfo.toFileAttributes() : null;
}
@NotNull
@@ -365,16 +365,7 @@ public class FileSystemUtil {
@Override
public FileAttributes getAttributes(@NotNull final String path) throws Exception {
final FileInfo fileInfo = myInstance.getInfo(path);
if (fileInfo == null) return null;
if (fileInfo.attributes == FileInfo.BROKEN_SYMLINK) return FileAttributes.BROKEN_SYMLINK;
final boolean isDirectory = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DIRECTORY);
final boolean isSpecial = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DEVICE);
final boolean isSymlink = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_REPARSE_POINT);
final boolean isHidden = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_HIDDEN);
final boolean isWritable = !isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_READONLY);
final long timestamp = fileInfo.getTimestamp();
return new FileAttributes(isDirectory, isSpecial, isSymlink, isHidden, fileInfo.length, timestamp, isWritable);
return fileInfo != null ? fileInfo.toFileAttributes() : null;
}
@Override
@@ -15,7 +15,10 @@
*/
package com.intellij.openapi.util.io.win32;
import org.intellij.lang.annotations.MagicConstant;
import com.intellij.openapi.util.io.FileAttributes;
import org.jetbrains.annotations.NotNull;
import static com.intellij.util.BitUtil.isSet;
/**
* Do not use this class directly.
@@ -24,25 +27,36 @@ import org.intellij.lang.annotations.MagicConstant;
* @since 12.0
*/
public class FileInfo {
public static final int BROKEN_SYMLINK = -1;
private static final int BROKEN_SYMLINK = -1;
private static final int FILE_ATTRIBUTE_READONLY = 0x0001;
private static final int FILE_ATTRIBUTE_HIDDEN = 0x0002;
private static final int FILE_ATTRIBUTE_DIRECTORY = 0x0010;
private static final int FILE_ATTRIBUTE_DEVICE = 0x0040;
private static final int FILE_ATTRIBUTE_REPARSE_POINT = 0x0400; // is set only for symlinks
public static final int FILE_ATTRIBUTE_READONLY = 0x0001;
public static final int FILE_ATTRIBUTE_HIDDEN = 0x0002;
public static final int FILE_ATTRIBUTE_DIRECTORY = 0x0010;
public static final int FILE_ATTRIBUTE_DEVICE = 0x0040;
public static final int FILE_ATTRIBUTE_REPARSE_POINT = 0x0400; // is set only for symlinks
private String name;
private int attributes;
private long timestamp;
private long length;
public String name;
@MagicConstant(flagsFromClass = FileInfo.class)
public int attributes;
public long timestamp;
public long length;
public long getTimestamp() {
return timestamp / 10000 - 11644473600000l;
public String getName() {
return name;
}
public String toString() {
return name;
}
@NotNull
public FileAttributes toFileAttributes() {
if (attributes == BROKEN_SYMLINK) return FileAttributes.BROKEN_SYMLINK;
final boolean isDirectory = isSet(attributes, FILE_ATTRIBUTE_DIRECTORY);
final boolean isSpecial = isSet(attributes, FILE_ATTRIBUTE_DEVICE);
final boolean isSymlink = isSet(attributes, FILE_ATTRIBUTE_REPARSE_POINT);
final boolean isHidden = isSet(attributes, FILE_ATTRIBUTE_HIDDEN);
final boolean isWritable = !isSet(attributes, FILE_ATTRIBUTE_READONLY);
final long javaTimestamp = timestamp / 10000 - 11644473600000l;
return new FileAttributes(isDirectory, isSpecial, isSymlink, isHidden, length, javaTimestamp, isWritable);
}
}