Sprawdzanie czy dany katalog istnieje i czy można do niego zapisać

0

Witam

Muszę poprawić fragment kodu w moim programie dlatego zrobiłem testową klasę do sprawdzenia tego fragmentu. Program prosi użytkownika o podanie ścieżki do katalogu następnie sprawdza czy dany katalog istnieje czy można do niego zapisać oraz czy nie jest plikiem. Problem pojawia się kiedy jako ścieżkę podamy np. CDROM program wywala wyjątek, a powinien wykryć, że nie można tam zapisywać i poprosić nas o podanie nowej ściezki. W jaki sposób można sprawdzić czy podana ścieżka nie jest CDROMem, albo jak rozwiązać ten problem?

Oto co już napisałem:

 
import java.io.File;
import java.util.Scanner;

public class Testowa {

    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        String directory;
        System.out.println("Podaj katalog");
        directory = scanner.next();
        boolean ok = true;

        do {
            char[] c = directory.toCharArray();
            if ((!"\\".equals(String.valueOf(c[c.length - 1]))) && (!"//".equals(String.valueOf(c[c.length - 1])))) {
                directory += "\\";
            }
            File file = new File(directory);
            if (file.exists()) {
                if (file.isFile()) {
                    System.out.println("Podao ścieżkę do pliku a nie katalogu, proszę podać nową scieżkę:");
                    directory = scanner.nextLine();
                    file = new File(directory);
                    ok = false;
                } else { //kiedy jets katalogiem
                    if (file.canWrite()) {
                        ok = true;
                        System.out.println("Zaakceptowano katalog");
                    } else {
                        System.out.println("W podanym katalogu nie można zapisywać");
                        System.out.println("Podaj inną ścieżkę:");
                        directory = scanner.nextLine();
                        ok = false;
                    }
                }
            } else { //jesli plik nie istnieje
                System.out.println("Podany katalog nie istnieje");
                System.out.println("Próbuje stworzyć dany katalog.");
                ok = file.mkdir();
                if (ok) {
                    System.out.println("Udało się stworzyć katalog.:");
                } else {
                    System.out.println("Nie udalo się stworzyć katalogu podaj inną ścieżkę:");
                    directory = scanner.nextLine();
                }
            }
        } while (!ok);
    }
}
0

Oczywiście sprawdziłeś w dokumentacji, co robi metoda nextLine()?

0

Nie sądziłem, że w tym miejscu popełniłem błąd. Zmieniłem metodę next() na nextLine() i działa. Wielkie dzięki.

0

@Bo nie w tym problem był raczej.
@Micah na przyszłość to oprócz stwierdzenia, że wyskakuje błąd, wypadałoby określić jaki bo IndexOutOfBoundsException jest jedynie i wyłącznie Twoją zasługą.

  1. Po kiego Ty właściwie przechodzisz na tablice charów ??
  2. Twoje magiczne wyszukiwanie ostatniego znaku w tablicy powodowało ten Twój błąd
  3. Proponuję zapoznanie się z dobrodziejstwami klasy String i taką metodą jak np endsWith(string s);
  4. Zobacz na przykładzie poniżej, jak w sprytny sposób można ominąć zmienną testową ok -> do lektury działanie instrukcji break i continue
    Poniżej działający kod
package javaapplication2;

import java.io.File;
import java.util.Scanner;
 
public class Testowa {
 
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        String directory;

        while(true) {
            System.out.println("\nPodaj katalog");
            directory = scanner.next();
            directory = directory.replace("\\", File.separator).replace("/", File.separator);
            File file = new File(directory);
            if (file.exists()) {
                if (file.isFile()) {
                    System.out.println("Podao ścieżkę do pliku a nie katalogu, spróbuj jeszcze raz");
                    continue;
                } 
                else if(file.isDirectory()) 
                { //kiedy jets katalogiem
                    if (file.canWrite()) {
                        System.out.println("Zaakceptowano katalog");
                        break;
                    } else {
                        System.out.println("W podanym katalogu nie można zapisywać");
                        continue;
                    }
                }
            } else { //jesli plik nie istnieje
                System.out.println("Podany katalog nie istnieje");
                System.out.println("Próbuje stworzyć dany katalog.");
                ok = file.mkdir();
                if (ok) {
                    System.out.println("Udało się stworzyć katalog.:");
                    break;
                } else {
                    System.out.println("Nie udalo się stworzyć katalogu podaj inną ścieżkę:");
                    continue;
                }
            }
        }
    }
}
0

Być może nie w tym był problem ale zostawiam nextLine() ponieważ daję możliwość tworzenia katalogów, które w nazwie zawierają spację, także w tym wypadku będzie lepszym wyborem niż next().
Szukałem w String metody podobnej do endsWith(string s), ale robiłem to na szybko widocznie przeoczyłem i musiałem sobie jakoś poradzić.
Instrukcje break i continue są mi dobrze znane ale za ich stosowanie zostałem dosyć ostro skrytykowany przez wykładowce dlatego teraz wolę ich unikać.

0

witam mam maly problem podobne zadanie robie i wiem ze pewnie dostane za takie głupie pytania ale dopiero zaczynam przygodę z java ucze się od 2 tygodni i nie mam pojęcia jak zrobić że gdy wpisuje sciezke do pliku to pojawi się ze nie istnieje taki plik

public class zad1 {
public static void main(String[] args)
{
Scanner scanner= new Scanner(System.in);
String sciezka;
System.out.println("podaj sciezke");
sciezka=scanner.next();
boolean ok=true;

    File plik = new File("plik.txt");
    if (plik.exists()) {
        System.out.println("istnieje");

}else{
        System.out.println( "podany plik nie istnieje");




    }

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