Obiekt klasy File nie widzi dysków sieciowych pod Win Vista i Win 7

0

Dzień dobry
Napisałem program, który działa na plikach i folderach na dysku sieciowym. W programie korzystam z klasy File (java.io.File). Pod Windowsem XP program działa. W wyniku wykonania poniższego kodu

File kat = new File("\\\\192.168.2.11\\Baza");
System.out.println(kat.isDirectory());

otrzymuję wartość true

Pod Windowsem Vista oraz Windowsem 7 ten sam kod powoduje wyświetlenie wartości false.
podobnie jest, gdy mam zmapowany dysk sieciowy i zamiast adresu IP mam np. S:. Pod XP działa, pod Vista i 7 nie działa.

Bardzo proszę o pomoc

0

Spróbuj użyć nowej obsługi systemu plików zaktualizowanej w Javie 7, czyli np. FileChannel, zamiast przestarzałej klasy File, która od tej wersji jest utrzymywana wyłącznie w celu zgodności ze starszym kodem. Stare klasy Javy oparte są pod Windą na starszych wywołaniach WinAPI, które pod nowymi systemami mogą nie działać lub mają ograniczenia, których nie było w poprzednich wersjach. Kod Javy został miejscami oparty o nieudokumentowane wywołania lub założenia, które w starym systemie działały "psim swędem" (działały, ale oficjalna dokumentacja tego nie potwierdzała). Można spróbować sprawdzić w kodzie źródłowym JRE do jakich wywołań systemowych dana klasa się odwołuje i sprawdzić dokumentację tych wywołań pod nowszym systemem, ale jest to czasochłonne i nie daje żadnych rozwiązań problemu jeżeli chodzi o Javę. Dlatego warto najpierw sprawdzić nowsze klasy Javy bo te mogą działać prawidłowo. Szczególnie pod Win 7 x64 lub nowszym.
Można taż spróbować zrobić myk, który raz mi zadziałał - ustawić dla java.exe tryb zgodności z Windows XP SP2 lub SP3. Dla pewności, wywoływanej wersji można wywalić wszystkie znalezione java.exe i jawaw.exe w katalogu %SystemRoot% i jego podkatalogach oraz ustawić prawidłową ścieżkę wywoływania do katalogu JRE/bin, tam gdzie jest właściwa instalacja.

0

Bardzo dziękuję za odpowiedź.
Szukałem sposobu, aby wykorzystać klasę FileChannel do utworzenia katalogu, ale ta klasa chyba tego nie potrafi. Klasa File ma inną funkcjonalność niż FileChannel. Ustawienie trybu zgodniści z XP też nie wchodzi w grę, bo na komputerze mogą być inne programy wykorzystujące jave, dla działania których zgodność javy z XP nie będzie korzystna.
Nadal poszukuję rozwiązania tego problemu, ale dziękuję za podjętą próbę pomocy.

0

Tobie potrzebne jest to:
Files.createDirectory(Path dir, FileAttribute<?>... attrs)

Lub w bardziej szczegółowej postaci (takiej jak dostęp sieciowy):
FileSystems.getDefault() lub FileSystems.getFileSystem(URI uri) żeby otrzymać obiekt typu FileSystem.
Z niego wyciągasz metodą public provider() obiekt FileSystemProvider, który ma:
public abstract void createDirectory(Path dir, FileAttribute<?>... attrs),
public void createSymbolicLink(Path link, Path target, FileAttribute<?>... attrs) throws IOException,
public void createLink(Path link, Path existing) throws IOException,
itd...

Wszystko to powstało dopiero w Javie 7. Dopiero od tej wersji można łapać i reagować na niuanse różnych systemów plików, w tym takie podstawy jak tworzenie katalogów czy linków.

0

:)Bardzo dziękuję

te 2 linijki:

Path path = Paths.get("//nazwa_sieciowa_komputera/katalog");
Files.createDirectory(path);

tworzą katalog i wszystko działa jak powinno.

Jednak, jeżeli dostęp do dysku sieciowego wymaga loginu i hasła, katalog nie zostaje utworzony i pojawia się wyjątek:
java.nio.file.FileSystemException: \SYNOLOGY1\Baza\ccc: Błąd logowania: nieznana nazwa użytkownika lub nieprawidłowe hasło.

Dzieje się tak również wtedy, gdy został już otworzony ręcznie dysk sieciowy i wpisane zostało hasło.
W jaki sposób i gdzie podać login i hasło, aby utworzenie katalogu było możliwe?

Z góry dziękuję za odpowiedź

0

Spróbuj użyć FileSystemProvider.checkAccess(Path path, AccessMode... modes) throws IOException z atrybutami READ i WRITE jednak prawdę mówiąc nie miałem jeszcze potrzeby i okazji użycia, więc czy to jest właściwym rozwiązaniem tego nie wiem. Wynik tego wywołania to void, więc najwyraźniej zmienia stan JVM (na logikę mogłoby przy pierwszym użyciu wyrzucać systemowe okno logowania jako efekt uboczny, ale pewności nie mam).

0

Nie wiem czy to miało tak wyglądać:

Path path = Paths.get("//nazwa_sieciowa_komputera/katalog");
 
FileSystem fs = FileSystems.getDefault();
FileSystemProvider provider = fs.provider();
 
try {
        provider.checkAccess(path, AccessMode.READ, AccessMode.WRITE);
} catch (IOException e) {
        e.printStackTrace();
}

...ale w wyniku wykonania tego kodu też wyskakuje wyjątek : "Błąd logowania: nieznana nazwa użytkownika lub nieprawidłowe hasło."

1 użytkowników online, w tym zalogowanych: 0, gości: 1