Problem z File - nie widzi mimo poprawnej ścieżki

0

Cześć,

Piszę prosty programik wysyłający maila z załączonym plikiem na moją skrzynkę pocztową. W zasadzie wszystko jest gotowe, ale nie moge uporać się z jednym błędem, którego przyczyny nie jestem się w stanie doszukać (zrozumieć).

Drag&Dropem wrzucam plik na pole tekstowe i po drobnej obróbce wydobywam jego ścieżkę, która jest wyświetlana następnie na tym polu. Przekazuję ścieżkę dalej, do wysłania pliku, ale tu się pojawia problem, bo wyświetla mi, że plik z taką ścieżką nie istnieje. Zrobiłem sobie mały teścik, żeby zobaczyć co się dzieje:

        try{
            File file = new File(FilePath);
            //BufferedReader br = new BufferedReader(new FileReader(file));
            System.out.println("**************************");
            System.out.println("Path: "+file.getAbsolutePath());
            System.out.println("Name: "+file.getName());
            System.out.println("File: "+file.exists());
            System.out.println("AbsoluteFile: "+file.getAbsoluteFile().exists());
            System.out.println("CanExec: "+file.canExecute());
            System.out.println("CanRead: "+file.canRead());
            System.out.println("CanWrite: "+file.canWrite());
            System.out.println("IsFile: "+file.isFile());
            System.out.println("Length: "+file.length());
            //System.out.println(br.readLine());
            System.out.println("**************************");

        } catch(Exception e) {
            System.out.println("Exception: "+e.getMessage());
        }

I w pierwszej wersji (zakomentowanej) wyświetla mi:

**************************
Path: /home/v/Pulpit/bob.txt
Name: bob.txt
File: false
AbsoluteFile: false
CanExec: false
CanRead: false
CanWrite: false
IsFile: false
Length: 0
**************************

A w drugiej:
Exception: /home/v/Pulpit/bob.txt (No such file or directory)

Zupełnie nie rozumiem o co chodzi, ścieżka jest jak najbardziej poprawna. Pewnie pominąłem jakąś elementarną sprawę.
Jeśli ktoś ma pomysł, będę wdzięczny.

Pozdrawiam

0

może nie masz uprawnień?

0

Nope

0
CanRead: false
...
IsFile: false

Z tego wynika, że bob.txt nie jest plikiem i nie możesz z niego czytać (czymkolwiek on jest).

0

Z tym ze mam tak ze wszystkimi 'plikami'.

0

File nie reprezentuje pliku lecz nazwę pliku lub katalogu czyli pozycję katalogową. Utworzenie obiektu przez File file = new File(jakieś_śmiecie_tekstowe) spowoduje powstanie poprawnego obiektu javy, ale nie jest to często ani plik, ani katalog w bieżącym systemie plików.
Aby sprawić, że system operacyjny zaakceptuje taki obiekt jako poprawną reprezentację pozycji katalogowej trzeba pobrać jego postać kanoniczną czyli użyć metody file.getCanonicalPath() i przetestować ewentualne wystąpienie wyjątków IOException i SecurityException. Jeżeli wyjątki nie pojawią się, to dopiero wtedy można utworzyć obiekt File przez new File(file.getCanonicalPath()) lub od razu użyć file.getCanonicalFile(), który odda gotowy obiekt File, którego ścieżkę system może w tym momencie zaakceptować.
Dopiero wtedy flagi takie jak exist, isFile, isDirectory, isHidden, canRead czy canWrite (lub informacje dodatkowe takie jak lastModified() czy length()) będą miały rzeczywistą wartość informacyjną (prawdziwą). Pierwszy obiekt file utworzony z jakiegoś ciągu znaków, który nie musi mieć jeszcze ścieżki kanonicznej jest praktycznie do wyrzucenia (bezużyteczny).
Postać kanoniczna to taka postać, która ma rozwinięte wszelkie wystąpienia "..", ".", nazwy zmiennych systemowych itp. występujące w ścieżce oraz posiada postać ścieżki absolutnej czyli zaczynającej się od roota, a nie od np. bieżącego katalogu czy katalogu home (~). Oprócz tego poprawiane jest właściwe użycie separatorów czyli slasha i backslasha (czasem widzi się takie niekanoniczne potworki jak "c:/home/").
Dopiero po takim sprawdzeniu można zagwarantować, że ścieżka będzie odpowiadała dokładnie jednemu plikowi lub katalogowi dostępnemu w systemie operacyjnym i odwrotnie (nawet jeszcze nie istniejącemu - co sprawdza się wtedy przez File.exist()). Dlatego przy kontakcie z systemem operacyjnym trzeba praktycznie zawsze posługiwać się ścieżkami kanonicznymi.

ps. Generalnie klasa File została kiepsko zaprojektowana bo nie można z całą pewnością powiedzieć co naprawdę reprezentuje. ;)

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