Napotkałem błąd, za którym nie mogę znaleźć żadnej logiki. Mam ten obiekt File, który jest utworzony w ten sposób:
File file = new File("utilities/data/someTextFile.txt");
Wtedy robię file.exists()
i wraca false
(!?). Jeśli plik nie zostanie znaleziony, loguję się f.getAbsolutePath()
do pliku. Kiedy patrzę na ścieżkę, wydaje mi się, że jest OK. Mogę skopiować i wkleić pełną ścieżkę do okna „Uruchom” w systemie Windows i plik otwiera się dobrze.
Plik istnieje przez cały czas i nie jest usuwany ani zmieniany podczas działania mojej aplikacji. Znajduje się na komputerze lokalnym.
Wydaje się, że ma to miejsce tylko w określonych sytuacjach. Mogę odtworzyć usterkę w dowolnym momencie, ale jestem pewien, że ścieżka obiektu pliku nie jest zmieniana przez działania, które wykonuję w celu odtworzenia błędu.
Co może spowodować file.exists()
zwrócenie fałszu? Czy ma to coś wspólnego z uprawnieniami lub blokadami plików itp.?
Odpowiedzi:
W systemie Windows 7 widzę następującą sytuację:
file.exists() == false file.getAbsoluteFile().exists() == true
Ten plik to „var \ log”, ścieżka bezwzględna odnosi się do istniejącego pliku, który znajduje się w normalnym podkatalogu (nie w magazynie wirtualnym). Widać to z IDE.
źródło
Wygląda na to, że istnieje różnica w sposobie określania ścieżki w Javie.
Na przykład, jeśli ścieżka pliku jest określona jako
file:/C:/DEV/test.txt
wtedyFile f = new File(filename); f.exists();
powróci
false
. Ścieżka może działać w eksploratorze lub przeglądarce, ale jest to adres URL, a nie bezwzględna ścieżka do pliku.Ale z drugiej strony, jeśli ścieżka pliku jest określona jako
C:/DEV/test.txt
wtedyFile f = new File(filename); f.exists();
zwróci,
true
ponieważ ścieżka nie jest adresem URL, ale ścieżką bezwzględną.W przypadku Spring Framework dokładnie to
ResourceUtils.getFile(filename)
działa - gdzie nazwa może być adresem URL lub bezwzględną ścieżką do pliku.źródło
file:/C:/DEV/test.txt
się, że będę działać jako ścieżka. To adres URL, a nie ścieżka. Chociaż niektórzy popełniają ten błąd, nie ma dowodów na to, że OP ma ...Jeśli proces nie ma uprawnień do stwierdzenia, czy plik istnieje, zwróci false. Otwarcie pliku może być możliwe, ale nie można stwierdzić za pomocą zwykłych metod, czy istnieje.
źródło
Powyższe odpowiedzi nie pomogły w moim przypadku. Jak wspomniano powyżej, miałem:
file.exists() => false file.getAbsoluteFile().exists => true
Główną przyczyną tego było to, że właściciel komputera z systemem Windows 7 zmodyfikował rejestr dla CMD, tak aby automatycznie uruchamiał polecenie uruchamiania w określonym katalogu do pracy z Pythonem. Ta modyfikacja sparaliżowała kod Javy 1.6, który najwyraźniej używa CMD w systemie Windows do niektórych operacji na plikach, takich jak
exists()
. Usunięcie automatycznego uruchamiania z rejestru rozwiązało problem.źródło
()
to, że brakuje w drugiej linii poexists
; )Gdy ["Ukryj rozszerzenia znanych typów plików."] Jest zaznaczone, okna otwierają "t.txt.txt" po wpisaniu "t.txt" w [eksploratorze] / [uruchom okna], ale programowo nie.
źródło
Oczywiście istnieje wiele możliwych przyczyn, a poprzednie odpowiedzi dobrze je dokumentują, ale oto jak rozwiązałem to w jednym konkretnym przypadku:
Mój uczeń miał ten problem i prawie wyrwałem sobie włosy, próbując go rozgryźć. Okazało się, że plik nie istnieje, chociaż na to wyglądał. Problem polegał na tym, że system Windows 7 został skonfigurowany do „Ukrywania rozszerzeń plików dla znanych typów plików”. Oznacza to, że jeśli plik wydaje się mieć nazwę „dane.txt”, jego rzeczywista nazwa to „dane.txt.txt”.
Mam nadzieję, że pomoże to innym zaoszczędzić trochę włosów.
źródło
new File
Komenda właśnie tworzy instancję pliku przy użyciu danej nazwy ścieżki. W rzeczywistości nie tworzy pliku na dysku twardym.Jeśli powiesz
File file = new File ("path"); file.exists()
Może to zwrócić wartość true tylko wtedy, gdy istnieje plik o tej samej ścieżce. Jeśli zamierzałeś sprawdzić ten sam plik zadeklarowany w pierwszej linii, być może będziesz musiał użyć go w ten sposób.
File file = new File ("path"); file.createNewFile(); file.exists();
Teraz to wróci prawda.
źródło
Jeśli nie chcesz zajmować się wywołaniami getAbsoluteFile () za każdym razem, gdy musisz wywołać metodę, lepiej utwórz instancję pliku z bezwzględną ścieżką. To powinno załatwić sprawę:
File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();
Przy okazji proponuję otoczyć go blokiem try-catch.
źródło
Uogólniając problem, pojawia się problem podczas konwersji adresu URL / URI na ścieżki lokalne.
Example: URL url = file:/D:/code%20repo%20sample/sample.txt // To remove url reference String localPath = url.getPath(); > /D:/code%20repo%20sample/sample.txt // Decoding reserved characters in url from hexadecimal to character URLDecoder.decode(localPath, StandardCharsets.UTF_8.toString()); > /D:/code repo sample/sample.txt
Mam nadzieję że to pomoże.
źródło
Dobre odpowiedzi dla wszystkich. Zauważyłem, że jest to problem z dostępem Javy do
C:
katalogu głównego w systemie Windows. Każdy inny katalog powinien być w porządku, ale z jakiegoś powodu, szczególnie wspominającC:\
lubC:
lubC:/
może powodować błąd. Rozwiązałem ten bardzo podobny problem, przechwytując wzmiankę donew File("C:");
i zastępując ją nową. WFile(System.getProperty("file.separator"));
przeciwnym razie powinieneś być w stanie zakodować na stałe „\” zamiast mówić „c:” jako katalog plików i może się udać. Nie eleganckie, ale wykonałem swoją pracę przy tym projekcie.Mam nadzieję, że to pomoże. Może nie jest to właściwe rozwiązanie, ale przynajmniej mi się udało. Jestem włączony
JRE 1.6, Win 7
. Twoje zdrowie!Z poważaniem
@ Carpenter1010
źródło
Jeśli sytuacja, w której się nie powiedzie, wymaga uruchomienia go jako innego użytkownika, a pracujesz w systemie Windows Vista / Windows 7, może to być spowodowane przez VirtualStore, mechanizm, w którym system Windows pozwala nieuprzywilejowanemu użytkownikowi „pisać”, normalnie nie może tego zrobić. Zmiany są jednak przechowywane w „% USERPROFILE% \ AppData \ Local \ VirtualStore \”, które są prywatne dla każdego konta użytkownika.
źródło
Kiedy nic z góry nie działało, próbowałem
Spowoduje to oczyszczenie sznurka z wszelkich niechcianych znaków
źródło
Niedawno natknąłem się na ten sam problem. To, co zrobiłem, to odinstalowanie Netbeans, usunięty folder netbeans z dysku C, pliki programów, aktualizacja, programData, praktycznie wszędzie. Następnie zainstaluj ponownie. Teraz działa dobrze. Nie zapomnij wykonać kopii zapasowej folderu projektu netbeans przed wykonaniem powyższych czynności.
Mam nadzieję, że to pomoże.
źródło
Z niektórymi IDE (może być) i lub z niektórymi systemami operacyjnymi (np. Okno), domyślnie nie mają prawa zapisu plików. Więc jeśli spróbujesz zrobić file.exists (), pokaże ci to false. aby to naprawić, wykonaj poniższe czynności
jeśli zmienną ref dla File jest f, przykład: File f = new File ("path");
więc aby to działało, wybierz f za pomocą myszy, a następnie przejdź do menu Wyszukaj> Dostęp do zapisu> Przestrzeń robocza. Mam nadzieję, że to zadziała.
źródło
Myślę, że zamiast tego powinieneś użyć odwrotnego ukośnika, na przykład:
Plik plik = nowy Plik ("C: \\ Użytkownik \\ narzędzia \\ dane \\ jakiśTekstFile.txt"); (dwa ukośniki odwrotne, bez literówki)
Powinien rozwiązać problem :)
źródło