mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Don't miss Win32FsCache
This commit is contained in:
@@ -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);
|
||||
|
||||
+3
-41
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user