File.exists (), dosya mevcut olduğunda yanlış döndürür


91

Arkasında herhangi bir mantık bulamadığım bir hatayla karşılaştım. Şu şekilde oluşturulan bu File nesnesine sahibim:

File file = new File("utilities/data/someTextFile.txt");

Sonra yapıyorum file.exists()ve geri dönüyor false(!?). Dosya bulunamazsa, f.getAbsolutePath()bir dosyaya giriş yapıyorum . Yola baktığımda iyi görünüyor. Tam yolu Windows'taki "Çalıştır" penceresine kopyalayıp yapıştırabilirim ve dosya düzgün bir şekilde açılıyor.

Dosya her zaman mevcuttur ve uygulamamın çalışması sırasında silinmez veya değiştirilmez. Yerel makinede bulunur.

Bu sadece belirli durumlarda meydana geliyor gibi görünüyor. Hatayı istediğim zaman yeniden oluşturabilirim, ancak eminim ki dosya nesnesinin yolu, hatayı yeniden oluşturmak için yaptığım eylemlerle değiştirilmez.

file.exists()Yanlış dönmesine ne sebep olabilir ? Bunun izinler veya dosya kilitleri vb. İle bir ilgisi var mı?


Öyleyse, var () yanlış döndürse bile dosyadan okumak mümkün müdür?
Harry Lime

evet, var olsa bile dosyadan okuyabilirim () yanlış döndürür.
atsjoo

1
Hatayı yeniden üretmek için tam olarak ne gereklidir?
user85421

1
Bu, matlab'de yazılan ve java uygulamasında derlenen işlevleri çağıran bir uygulamanın içindedir. "Mevcut dizini" değiştiren matlab işlevleri sorunun ortaya çıkmasına neden oluyor gibi görünüyor. Dosya nesnesini oluştururken mutlak yolu kullanıyorum, bu yüzden bu bir sorun olmamalı - ancak öyle görünüyor. Elbette dosya nesnesinin mutlak yolunu doğruladım ve bu doğru (matlab işlevi geçerli dizini değiştirmeden önceki gibi).
atsjoo

7
Uzak bir dizine karşı çalışma şansınız var mı (örneğin bir NFS montajı)?
Tomer Gabel

Yanıtlar:


42

Windows 7'de aşağıdaki durumu görüyorum:

file.exists() == false
file.getAbsoluteFile().exists() == true

Söz konusu dosya "var \ log", mutlak yol, normal bir alt dizinde (sanal bir depoda değil) var olan bir dosyaya başvuruyor. Bu IDE'den görülüyor.


17
Şimdi anladım: bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097 Görünüşe göre, dosya üzerinde çalışan işlemler geçerli dizine karşı çözümlenirken, getAbsolutePath user.dir'e karşı çözümleniyor. Bu iki yol eşleşmezse, çelişkili sonuçlar alırsınız. Şeytani!
Roman Zenka

3
Dosyanın var olup olmadığını kontrol etmek için her iki yöntemi de kullanmaya çalıştığımla aynı sorunu yaşıyorum ve yine de yalnızca Windows 7'de yanlış alıyorum! Herhangi bir fikir?
Dejell

@Odelya: Hangi IDE kullanıyorsunuz? -Duser.dir ayarınız ne? Sorunum, -Duser.dir'i geçerli çalışandan farklı bir dizine ayarlamaktan kaynaklandı.
Roman Zenka

1
Dinamik Web Projesi üzerinde çalışan herkes için file.exists () kullanmak bir istisna oluşturacaktır, WEB-INF dizinindeki dosyaları kontrol etmek için file.getAbsoluteFile (). Var () kullanın (Windows 7'ye özel değil ).
PS

Bu cevap ve yorumlar için ayrı bir QA oluşturmayı düşünün
Bato-Bair Tsyrenov

17

Java'da yolun nasıl belirtildiği konusunda bir fark var gibi görünüyor.

Örneğin, dosya yolu file:/C:/DEV/test.txto zamanki gibi belirtilmişse

File f = new File(filename);
f.exists();

dönecek false. Yol, gezginde veya tarayıcıda çalışabilir, ancak bir URL'dir ve mutlak dosya yolu değildir.

Ancak diğer yandan, dosya yolu C:/DEV/test.txto zamanki gibi belirtilmişse

File f = new File(filename);
f.exists();

trueyol bir URL olmadığı, ancak mutlak bir yol olduğu için dönecektir .

İle Bahar Framework o tam olarak ne ResourceUtils.getFile(filename)ad URL veya mutlak dosya yolu olabildiği yerlerde - yapar.


5
file:/C:/DEV/test.txtBir yol adı olarak çalışmayı beklemiyorum . Bu bir URL, yol adı değil. Bazı insanlar bu hatayı yaparken, OP'nin ...
Stephen C

15

İşlemin bir dosyanın var olup olmadığını söyleme izni yoksa yanlış döndürür. Bir dosyayı açmak mümkün olabilir, ancak var olup olmadığını normal yöntemlerle söyleyemez.


21
İlginç. biraz daha açıklayabilir misin? Aklınızda hangi özel izinler var?
Clément

Burada java.nio.file.AccessDeniedException dosya / dir varlığına ulaşmayı engelleme yeteneği olabilir. Örneğin, dizini FAR veya başka bir dosya gezgininde açık tutarsanız, tüm iç içe geçmiş dosyalarla birlikte dizini silin ve bu dizinin varlığını kontrol ederseniz, sizin için tutulan geçici dosya için AccessDeniedException (IOException'ı uzatır) alabilirsiniz. Bu durumda Files.exists, IOException için false değerini döndürür.
beluha

11

Yukarıdaki cevaplar benim durumumda yardımcı olmadı. Yukarıda belirtildiği gibi, şunlara sahiptim:

file.exists() => false
file.getAbsoluteFile().exists => true

Bunun temel nedeni, Windows 7 makine sahibinin, Python ile çalışmak üzere belirli bir dizinde başlatmak için bir komutu otomatik olarak çalıştıracak şekilde CMD için kayıt defterini değiştirmesiydi. Bu modifikasyon sakat Java 1.6 görünüşte kullanan bir kod CMD üzerinde Windows'un gibi belirli dosya işlemleri için exists(). Otomatik çalıştırmayı kayıt defterinden kaldırmak sorunu çözdü.


1
3.5 yıl sonra aynı sorunla karşılaştım. Cmd.com'u her başlattığımda ortam değişkenlerini yapılandırmak için otomatik çalıştırma betiği kurdum. Mevcut dizini bile değiştirmedi - sadece bazı doskey makroları ve bazı ortam değişkenleri. Otomatik çalıştırmayı kaldırdım ve dosyadaki komutları manuel olarak çalıştırdım ve aniden File.exists () düzgün çalışıyor.
Homr Zodyssey

1
OMG, gerçekten işe yarıyor (ikisi de), sadece aptalca yanlış dosyayı kontrol ediyordum ve neden hiçbirinin benim için çalışmadığını öğrenmek için bu soruya rastladım :) BTW, ()sonra ikinci satırda eksik görünüyor exists; )
RAM237

3

["Bilinen dosya türleri için uzantıları gizle"] işaretlendiğinde, [gezgin] / [pencereleri çalıştır] 'a "t.txt" yazarken pencereler "t.txt.txt" yi açar, ancak programlı olarak açmaz.


1
Bu sorunu yaşadım ve sorun C: \ test içinde 'testFile.txt' adlı bir txt dosyası oluşturmamdı. Bu dosyaya, çalışmayan C: \ test \ testFile.txt yolunu kullanarak başvurdum. Bunun nedeni dosyanın gerçekten testFile.txt.txt olarak kaydedilmiş olması, dolayısıyla yukarıdaki çözüme yönelik yukarı oylama (Eski soru, ancak kabul edilen yanıt yok!)
Theblacknight

Tanrı Windows çok berbat.
aafc

3

Açıkçası bir dizi olası neden var ve önceki cevaplar bunları iyi belgeliyor, ancak işte bunu belirli bir durumda nasıl çözdüm:

Bir öğrencimde bu sorun vardı ve anlamaya çalışırken neredeyse saçımı yırtıyordum. Göründüğü gibi görünmesine rağmen dosyanın var olmadığı ortaya çıktı. Sorun, Windows 7'nin "Bilinen dosya türleri için dosya uzantılarını gizle" olarak yapılandırılmış olmasıydı. Bu, dosyanın adı "data.txt" görünüyorsa, gerçek dosya adının "data.txt.txt" olduğu anlamına gelir.

Umarım bu, başkalarının kendilerini biraz saç kurtarmasına yardımcı olur.


Benim durumumdaki sorunun bu olduğunu sanmıyorum. Sorumda belirtildiği gibi: "Windows'taki" Çalıştır "penceresine tüm yolu kopyalayıp yapıştırabilirim ve dosya düzgün bir şekilde açılıyor." Bu, dosyanın gerçekten var olduğu anlamına gelir.
atsjoo

3

new FileKomut sadece verilen yol adını kullanarak bir dosyanın bir örneğini oluşturur. Aslında sabit sürücüde bir dosya oluşturmaz.

Eğer öyle diyorsan

File file = new File ("path");
file.exists() 

Bu, yalnızca aynı yola sahip mevcut bir dosya varsa true döndürebilir. İlk satırda belirtilen aynı dosyayı kontrol etmek istediyseniz, bu şekilde kullanmanız gerekebilir.

File file = new File ("path");
file.createNewFile();
file.exists();

Şimdi bu gerçek olacak.


küçük açıklama: new anahtar sözcüğü kullanılarak kurucuya yapılan her çağrı bir Nesne oluşturur - bu durumda, Sınıf tarafından tanımlanan ve adı Dosya olan bir Nesne ile aynıdır! bu yüzden bir Dosya örneği değil! = tanımlayıcılar :)
ceph3us

3

Bir yöntemi her çağırmanız gerektiğinde getAbsoluteFile () çağrılarıyla uğraşmak istemiyorsanız, dosya örneğinizi zaten mutlak bir yolla oluşturmanız daha iyi olur. Bu hile yapmalı:

File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();

Onu bir deneme yakalama bloğu, BTW ile çevrelemenizi öneririm.


2

Sorunu genelleştirmek için URL / URI'yi yerel yollara dönüştürürken sorun ortaya çıkıyor.

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

Bu yardımcı olur umarım.


0

Herkese iyi tepkiler. Bunun, Java'nın C:Windows'ta kök dizine erişmesiyle ilgili bir sorun olduğunu buldum . Başka dizin özellikle söz, iyi olacak, ama nedense gerektiğini C:\ya C:ya C:/bir hata verebilir. Bu çok benzer sorunu, bahsetmeyi yakalayıp new File("C:");yenisiyle değiştirerek çözdüm File(System.getProperty("file.separator"));ya da dosya dizininiz olarak "c:" demek yerine "\" sabit kodlamanız gerekir ve işe yarayabilir. Zarif değil, ama bu projede benim için işi bitirdi.

Umut ediyorum bu yardım eder. Doğru çözüm olmayabilir ama en azından benim için işe yaradı. Ben varım JRE 1.6, Win 7. Şerefe!

Saygılarımızla,

@ Marangoz10


0

Başarısız olduğu durumlar başka bir kullanıcı olarak çalıştırmayı içeriyorsa ve Windows Vista / Windows 7 kullanıyorsanız, Windows'un ayrıcalıklı olmayan bir kullanıcının normalde yapamayacağı "yazmasına" izin verdiği mekanizma olan VirtualStore'dan kaynaklanıyor olabilir. Ancak değişiklikler, her kullanıcı hesabına özel olan "% USERPROFILE% \ AppData \ Local \ VirtualStore \" klasöründe saklanır.


1
Windows xp x86 üzerinde çalışıyorum
atsjoo

0

Yukarıdan hiçbir şey benim için işe yaramadığında, denedim

filePath = filePath.trim();

Bu, dizenizi istenmeyen karakterlerden temizler


0

FWIW, bunun gerçekleştiği başka bir yer var.

File("")mevcut dizinin adıdır. File("").exists()genellikle geri dönecektir false. File(("").getAbsoluteFile().exists()Hüner çalışır ve dönecektir true(... geçerli dizin var varsayarsak)


-1

Son zamanlarda aynı sorunla karşılaştım. Yaptığım şey Netbeans'i, C sürücüsünden silen netbeans klasörünü, program dosyalarını, güncellemeyi, programData'yı, neredeyse her yerden kaldırmaktı. Ardından yeniden yükleyin. Şimdi iyi çalışıyor. Yukarıdaki işlemleri yapmadan önce netbeans proje klasörünü yedeklemeyi unutmayın.

Umarım yardımcı olur.


-1

Bazı IDE'lerde (olabilir) ve veya bazı işletim sistemlerinde (örn: pencere), varsayılan olarak dosyalara yazma erişimine sahip değildirler. Yani file.exists () yapmaya çalışırsanız size yanlış olduğunu gösterecektir. bunu düzeltmek için aşağıdaki gibi yapın

Dosya için ref değişkeniniz f ise, örneğin: Dosya f = yeni Dosya ("yol");

bu yüzden çalışmasını sağlamak için fareyle f öğesini seçin ve ardından Arama menüsü> Yazma erişimi> Çalışma Alanı'na gidin. Umarım işe yarar.


-2

Bunun yerine ters eğik çizgi kullanmalısın, şöyle:

Dosya dosyası = yeni Dosya ("C: \\ Kullanıcı \\ yardımcı programlar \\ veri \\ bazıTextFile.txt"); (iki ters eğik çizgi, yazım hatası değil)

Sorunu çözmeli :)


3
Bence mesele, mutlak yol yerine göreceli yolla ilgili. Eğik çizgi Java'da Windows yolları için bile geçerlidir.
рüффп
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.