622 }
623 if (removeFileOrDirectory(pathbuf) == 0) {
624 rv = JNI_TRUE;
625 }
626 free(pathbuf);
627 return rv;
628 }
629
630 JNIEXPORT jobjectArray JNICALL
631 Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
632 {
633 WCHAR *search_path;
634 HANDLE handle;
635 WIN32_FIND_DATAW find_data;
636 int len, maxlen;
637 jobjectArray rv, old;
638 DWORD fattr;
639 jstring name;
640 jclass str_class;
641 WCHAR *pathbuf;
642
643 str_class = JNU_ClassString(env);
644 CHECK_NULL_RETURN(str_class, NULL);
645
646 pathbuf = fileToNTPath(env, file, ids.path);
647 if (pathbuf == NULL)
648 return NULL;
649 search_path = (WCHAR*)malloc(2*wcslen(pathbuf) + 6);
650 if (search_path == 0) {
651 free (pathbuf);
652 errno = ENOMEM;
653 JNU_ThrowOutOfMemoryError(env, "native memory allocation failed");
654 return NULL;
655 }
656 wcscpy(search_path, pathbuf);
657 free(pathbuf);
658 fattr = GetFileAttributesW(search_path);
659 if (fattr == INVALID_FILE_ATTRIBUTES) {
660 free(search_path);
661 return NULL;
683 }
684
685 /* Open handle to the first file */
686 handle = FindFirstFileW(search_path, &find_data);
687 free(search_path);
688 if (handle == INVALID_HANDLE_VALUE) {
689 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
690 // error
691 return NULL;
692 } else {
693 // No files found - return an empty array
694 rv = (*env)->NewObjectArray(env, 0, str_class, NULL);
695 return rv;
696 }
697 }
698
699 /* Allocate an initial String array */
700 len = 0;
701 maxlen = 16;
702 rv = (*env)->NewObjectArray(env, maxlen, str_class, NULL);
703 if (rv == NULL) // Couldn't allocate an array
704 return NULL;
705 /* Scan the directory */
706 do {
707 if (!wcscmp(find_data.cFileName, L".")
708 || !wcscmp(find_data.cFileName, L".."))
709 continue;
710 name = (*env)->NewString(env, find_data.cFileName,
711 (jsize)wcslen(find_data.cFileName));
712 if (name == NULL)
713 return NULL; // error;
714 if (len == maxlen) {
715 old = rv;
716 rv = (*env)->NewObjectArray(env, maxlen <<= 1, str_class, NULL);
717 if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0)
718 return NULL; // error
719 (*env)->DeleteLocalRef(env, old);
720 }
721 (*env)->SetObjectArrayElement(env, rv, len++, name);
722 (*env)->DeleteLocalRef(env, name);
723
724 } while (FindNextFileW(handle, &find_data));
725
726 if (GetLastError() != ERROR_NO_MORE_FILES)
727 return NULL; // error
728 FindClose(handle);
729
730 if (len < maxlen) {
731 /* Copy the final results into an appropriately-sized array */
732 old = rv;
733 rv = (*env)->NewObjectArray(env, len, str_class, NULL);
734 if (rv == NULL)
735 return NULL; /* error */
736 if (JNU_CopyObjectArray(env, rv, old, len) < 0)
737 return NULL; /* error */
738 }
739 return rv;
740 }
741
742
743 JNIEXPORT jboolean JNICALL
744 Java_java_io_WinNTFileSystem_createDirectory(JNIEnv *env, jobject this,
745 jobject file)
746 {
747 BOOL h = FALSE;
748 WCHAR *pathbuf = fileToNTPath(env, file, ids.path);
|
622 }
623 if (removeFileOrDirectory(pathbuf) == 0) {
624 rv = JNI_TRUE;
625 }
626 free(pathbuf);
627 return rv;
628 }
629
630 JNIEXPORT jobjectArray JNICALL
631 Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
632 {
633 WCHAR *search_path;
634 HANDLE handle;
635 WIN32_FIND_DATAW find_data;
636 int len, maxlen;
637 jobjectArray rv, old;
638 DWORD fattr;
639 jstring name;
640 jclass str_class;
641 WCHAR *pathbuf;
642 DWORD err;
643
644 str_class = JNU_ClassString(env);
645 CHECK_NULL_RETURN(str_class, NULL);
646
647 pathbuf = fileToNTPath(env, file, ids.path);
648 if (pathbuf == NULL)
649 return NULL;
650 search_path = (WCHAR*)malloc(2*wcslen(pathbuf) + 6);
651 if (search_path == 0) {
652 free (pathbuf);
653 errno = ENOMEM;
654 JNU_ThrowOutOfMemoryError(env, "native memory allocation failed");
655 return NULL;
656 }
657 wcscpy(search_path, pathbuf);
658 free(pathbuf);
659 fattr = GetFileAttributesW(search_path);
660 if (fattr == INVALID_FILE_ATTRIBUTES) {
661 free(search_path);
662 return NULL;
684 }
685
686 /* Open handle to the first file */
687 handle = FindFirstFileW(search_path, &find_data);
688 free(search_path);
689 if (handle == INVALID_HANDLE_VALUE) {
690 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
691 // error
692 return NULL;
693 } else {
694 // No files found - return an empty array
695 rv = (*env)->NewObjectArray(env, 0, str_class, NULL);
696 return rv;
697 }
698 }
699
700 /* Allocate an initial String array */
701 len = 0;
702 maxlen = 16;
703 rv = (*env)->NewObjectArray(env, maxlen, str_class, NULL);
704 if (rv == NULL) { // Couldn't allocate an array
705 FindClose(handle);
706 return NULL;
707 }
708 /* Scan the directory */
709 do {
710 if (!wcscmp(find_data.cFileName, L".")
711 || !wcscmp(find_data.cFileName, L".."))
712 continue;
713 name = (*env)->NewString(env, find_data.cFileName,
714 (jsize)wcslen(find_data.cFileName));
715 if (name == NULL) {
716 FindClose(handle);
717 return NULL; // error
718 }
719 if (len == maxlen) {
720 old = rv;
721 rv = (*env)->NewObjectArray(env, maxlen <<= 1, str_class, NULL);
722 if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0) {
723 FindClose(handle);
724 return NULL; // error
725 }
726 (*env)->DeleteLocalRef(env, old);
727 }
728 (*env)->SetObjectArrayElement(env, rv, len++, name);
729 (*env)->DeleteLocalRef(env, name);
730
731 } while (FindNextFileW(handle, &find_data));
732
733 err = GetLastError();
734 FindClose(handle);
735 if (err != ERROR_NO_MORE_FILES) {
736 return NULL; // error
737 }
738
739 if (len < maxlen) {
740 /* Copy the final results into an appropriately-sized array */
741 old = rv;
742 rv = (*env)->NewObjectArray(env, len, str_class, NULL);
743 if (rv == NULL)
744 return NULL; /* error */
745 if (JNU_CopyObjectArray(env, rv, old, len) < 0)
746 return NULL; /* error */
747 }
748 return rv;
749 }
750
751
752 JNIEXPORT jboolean JNICALL
753 Java_java_io_WinNTFileSystem_createDirectory(JNIEnv *env, jobject this,
754 jobject file)
755 {
756 BOOL h = FALSE;
757 WCHAR *pathbuf = fileToNTPath(env, file, ids.path);
|