Read file attributes through IdeaWin32

This commit is contained in:
Roman Shevchenko
2012-07-24 11:39:42 +02:00
parent 05f7376c64
commit 610c108de5
2 changed files with 52 additions and 2 deletions
@@ -56,7 +56,7 @@ public class SystemInfo extends SystemInfoRt {
public static final boolean isFileSystemCaseSensitive = SystemInfoRt.isFileSystemCaseSensitive;
public static final boolean areSymLinksSupported = isUnix ||
isWindows && OS_VERSION.compareTo("6.0") >= 0 && isJavaVersionAtLeast("1.7");
isWindows && OS_VERSION.compareTo("6.0") >= 0;
public static final boolean is32Bit = ARCH_DATA_MODEL == null || ARCH_DATA_MODEL.equals("32");
public static final boolean is64Bit = !is32Bit;
@@ -17,6 +17,8 @@ package com.intellij.openapi.util.io;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.win32.FileInfo;
import com.intellij.openapi.util.io.win32.IdeaWin32;
import com.intellij.util.ArrayUtil;
import com.intellij.util.SystemProperties;
import com.sun.jna.Library;
@@ -65,7 +67,17 @@ public class FileSystemUtil {
final String quickTestPath = SystemInfo.isWindows ? "C:\\" : "/";
if (!forceUseNio2) {
if (SystemInfo.isLinux || SystemInfo.isMac || SystemInfo.isSolaris || SystemInfo.isFreeBSD) {
if (SystemInfo.isWindows) {
try {
final Mediator mediator = new IdeaWin32MediatorImpl();
mediator.getAttributes(quickTestPath);
return mediator;
}
catch (Throwable t) {
LOG.warn(t);
}
}
else if (SystemInfo.isLinux || SystemInfo.isMac || SystemInfo.isSolaris || SystemInfo.isFreeBSD) {
try {
final Mediator mediator = new JnaUnixMediatorImpl();
mediator.getAttributes(quickTestPath);
@@ -330,6 +342,44 @@ public class FileSystemUtil {
}
private static class IdeaWin32MediatorImpl implements Mediator {
private static final String PATH_PREFIX = "\\\\?\\";
private static final int PREFIX_SIZE = PATH_PREFIX.length();
private IdeaWin32 myInstance = IdeaWin32.getInstance();
@Override
public FileAttributes getAttributes(@NotNull final String path) throws Exception {
final FileInfo fileInfo = myInstance.getInfo(path);
if (fileInfo == null) return null;
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.timestamp / 10000 - 11644473600000l;
return new FileAttributes(isDirectory, isSpecial, isSymlink, isHidden, fileInfo.length, timestamp, isWritable);
}
@Override
public String resolveSymLink(@NotNull final String path) throws Exception {
final String result = myInstance.resolveSymLink(path);
return result != null && result.startsWith(PATH_PREFIX) ? result.substring(PREFIX_SIZE) : result;
}
@Override
public void setPermissions(@NotNull final String path, final int permissions) throws Exception {
}
@NotNull
@Override
public String getName() {
return "IdeaWin32";
}
}
// thanks to SVNKit for the idea
private static class JnaUnixMediatorImpl implements Mediator {
@SuppressWarnings("OctalInteger")