JNIEXPORT jobject JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_getInfo(JNIEnv *env, jobject method, jstring path) { WIN32_FIND_DATA data; HANDLE h = FindFileInner(env, path, &data); if (h == INVALID_HANDLE_VALUE) { return NULL; } FindClose(h); jclass infoClass = env->FindClass("com/intellij/openapi/vfs/impl/win32/FileInfo"); return CreateFileInfo(env, path, false, &data, infoClass); }
JNIEXPORT jobjectArray JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_listChildren0(JNIEnv *env, jobject method, jstring path) { WIN32_FIND_DATA data; HANDLE h = FindFileInner(env, path, &data); if (h == INVALID_HANDLE_VALUE) { return NULL; } jclass fileInfoClass = getFileInfoClass(env); if (fileInfoClass == NULL) { return NULL; } jobjectArray rv, old; int len = 0, maxlen = 16; rv = env->NewObjectArray(maxlen, fileInfoClass, NULL); if (rv == NULL) { goto error; } do { if (len == maxlen) { old = rv; rv = env->NewObjectArray(maxlen <<= 1, fileInfoClass, NULL); if (rv == NULL || !CopyObjectArray(env, rv, old, len)) { goto error; } env->DeleteLocalRef(old); } jobject o = CreateFileInfo(env, path, true, &data, fileInfoClass); env->SetObjectArrayElement(rv, len++, o); env->DeleteLocalRef(o); } while (FindNextFile(h, &data)); FindClose(h); old = rv; rv = env->NewObjectArray(len, fileInfoClass, NULL); if (rv == NULL || !CopyObjectArray(env, rv, old, len)) { goto error; } return rv; error: FindClose(h); return NULL; }
JNIEXPORT jstring JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_resolveSymLink0(JNIEnv *env, jobject method, jstring path) { if (__GetFinalPathNameByHandle == NULL) { return NULL; // XP } WIN32_FIND_DATA data; HANDLE h = FindFileInner(env, path, &data); if (h == INVALID_HANDLE_VALUE) { return NULL; } FindClose(h); if (!IS_SET(data.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT) || !IS_SET(data.dwReserved0, IO_REPARSE_TAG_SYMLINK)) { return NULL; } const jchar* str = env->GetStringChars(path, 0); HANDLE th = CreateFile((LPCWSTR)str, 0, FILE_SHARE_ATTRIBUTES, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); env->ReleaseStringChars(path, str); if (th == INVALID_HANDLE_VALUE) { return NULL; } jstring result = NULL; TCHAR name[MAX_PATH]; DWORD len = __GetFinalPathNameByHandle(th, name, MAX_PATH, 0); if (len > 0) { if (len < MAX_PATH) { result = env->NewString((jchar *)name, len); } else { TCHAR *name = (TCHAR *)malloc(sizeof(TCHAR) * (len + 1)); if (name != NULL) { len = __GetFinalPathNameByHandle(th, name, len, 0); if (len > 0) { result = env->NewString((jchar *)name, len); } free(name); } } } CloseHandle(th); return result; }
JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) { bool isDrive = false; if (env->GetStringLength(path) == 2) { const jchar* str = env->GetStringChars(path, NULL); isDrive = (str[1] == ':'); env->ReleaseStringChars(path, str); } WIN32_FIND_DATA data; HANDLE h = INVALID_HANDLE_VALUE; if (!isDrive) { h = FindFileInner(env, path, &data); if (h == INVALID_HANDLE_VALUE && GetLastError() != ERROR_ACCESS_DENIED) { return NULL; } } if (h == INVALID_HANDLE_VALUE) { WIN32_FILE_ATTRIBUTE_DATA attrData; const jchar* str = env->GetStringChars(path, 0); BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData); env->ReleaseStringChars(path, str); if (!res) { return NULL; } data.dwFileAttributes = attrData.dwFileAttributes; data.dwReserved0 = 0; data.ftLastWriteTime = attrData.ftLastWriteTime; data.nFileSizeLow = attrData.nFileSizeLow; data.nFileSizeHigh = attrData.nFileSizeHigh; } else { FindClose(h); } jclass fileInfoClass = getFileInfoClass(env); if (fileInfoClass == NULL) { return NULL; } return CreateFileInfo(env, path, false, &data, fileInfoClass); }
JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) { WIN32_FILE_ATTRIBUTE_DATA attrData; const jchar* str = env->GetStringChars(path, 0); BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData); env->ReleaseStringChars(path, str); if (!res) { return NULL; } WIN32_FIND_DATA data; data.dwFileAttributes = attrData.dwFileAttributes; data.dwReserved0 = 0; data.ftLastWriteTime = attrData.ftLastWriteTime; data.nFileSizeLow = attrData.nFileSizeLow; data.nFileSizeHigh = attrData.nFileSizeHigh; if (IS_SET(attrData.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) { WIN32_FIND_DATA findData; HANDLE h = FindFileInner(env, path, &findData); if (h != INVALID_HANDLE_VALUE) { FindClose(h); data.dwFileAttributes = findData.dwFileAttributes; data.dwReserved0 = findData.dwReserved0; data.ftLastWriteTime = findData.ftLastWriteTime; data.nFileSizeLow = findData.nFileSizeLow; data.nFileSizeHigh = findData.nFileSizeHigh; } } jclass fileInfoClass = getFileInfoClass(env); if (fileInfoClass == NULL) { return NULL; } return CreateFileInfo(env, path, false, &data, fileInfoClass); }