Saya mengalami bug yang sepertinya tidak dapat saya temukan logika apa pun di baliknya. Saya memiliki objek File ini, yang dibuat seperti ini:
File file = new File("utilities/data/someTextFile.txt");
Saya kemudian melakukannya file.exists()
, dan kembali false
(!?). Jika file tidak ditemukan, saya masuk f.getAbsolutePath()
ke file. Ketika saya melihat jalannya, sepertinya OK. Saya dapat menyalin-tempel jalur lengkap ke dalam jendela "Jalankan" di Windows dan file terbuka dengan baik.
File tersebut ada setiap saat dan tidak dihapus atau diubah selama menjalankan aplikasi saya. Itu terletak di mesin lokal.
Ini sepertinya hanya terjadi dalam situasi tertentu. Saya dapat mereproduksi kesalahan kapan saja, tetapi saya yakin jalur objek file tidak diubah oleh tindakan yang saya buat untuk mereproduksi kesalahan.
Apa yang bisa menyebabkan file.exists()
return false? Apakah ini ada hubungannya dengan izin atau kunci file, dll.?
Jawaban:
Saya melihat situasi berikut di Windows 7:
file.exists() == false file.getAbsoluteFile().exists() == true
File yang dimaksud adalah "var \ log", path absolut mengacu pada file yang ada di subdirektori normal (bukan toko virtual). Ini terlihat dari IDE.
sumber
Sepertinya ada perbedaan tentang bagaimana jalur ditentukan di Java.
Misalnya, jika jalur file ditentukan seperti
file:/C:/DEV/test.txt
ituFile f = new File(filename); f.exists();
akan kembali
false
. Jalur tersebut mungkin berfungsi di penjelajah atau di browser, tetapi ini adalah URL dan bukan jalur file absolut.Tapi di sisi lain jika path file ditentukan seperti
C:/DEV/test.txt
ituFile f = new File(filename); f.exists();
akan kembali
true
karena jalur tersebut bukan URL, tetapi jalur absolut.Dengan Spring Framework itulah tepatnya
ResourceUtils.getFile(filename)
- di mana nama bisa berupa URL atau jalur file absolut.sumber
file:/C:/DEV/test.txt
untuk bekerja sebagai nama jalan. Ini adalah URL, bukan nama jalur. Sementara beberapa orang membuat kesalahan ini, tidak ada bukti bahwa OP memiliki ...Jika proses tidak memiliki izin untuk mengetahui apakah ada file itu akan mengembalikan false. Dimungkinkan untuk membuka file, tetapi tidak diberi tahu dengan metode normal jika ada.
sumber
Jawaban di atas tidak membantu dalam kasus saya. Seperti yang dinyatakan di atas, saya memiliki:
file.exists() => false file.getAbsoluteFile().exists => true
Akar penyebabnya adalah pemilik mesin Windows 7 telah memodifikasi registri untuk CMD sehingga akan menjalankan perintah secara otomatis untuk diluncurkan di direktori tertentu untuk bekerja dengan Python. Modifikasi ini melumpuhkan kode Java 1.6 yang tampaknya menggunakan CMD pada Windows untuk operasi file tertentu, seperti
exists()
. Menghilangkan autorun dari registri memecahkan masalah.sumber
()
ada yang hilang di baris kedua setelahexists
; )Ketika ["Sembunyikan ekstensi untuk jenis file yang dikenal."] Dicentang, jendela terbuka "t.txt.txt" ketika ketik "t.txt" di [explorer] / [jalankan windows] tetapi secara terprogram tidak.
sumber
Jelas ada sejumlah kemungkinan penyebab dan jawaban sebelumnya mendokumentasikannya dengan baik, tetapi inilah cara saya menyelesaikannya dalam satu kasus tertentu:
Seorang murid saya memiliki masalah ini dan saya hampir merobek rambut saya mencoba mencari tahu. Ternyata file tersebut tidak ada, meskipun sepertinya ada. Masalahnya adalah Windows 7 dikonfigurasi untuk "Sembunyikan ekstensi file untuk jenis file yang dikenal." Ini berarti bahwa jika file tampaknya memiliki nama "data.txt", nama file sebenarnya adalah "data.txt.txt".
Semoga ini bisa membantu orang lain menyelamatkan diri.
sumber
Itu
new File
perintah hanya menciptakan sebuah instance dari file menggunakan nama path yang diberikan. Itu sebenarnya tidak membuat file di hard drive.Jika Anda mengatakan
File file = new File ("path"); file.exists()
Ini dapat mengembalikan true hanya jika ada file yang sudah ada dengan jalur yang sama. Jika Anda bermaksud memeriksa file yang sama yang dideklarasikan di baris pertama, Anda mungkin perlu menggunakannya dengan cara ini.
File file = new File ("path"); file.createNewFile(); file.exists();
Sekarang ini akan kembali menjadi kenyataan.
sumber
Jika Anda tidak ingin berurusan dengan panggilan getAbsoluteFile () setiap kali Anda harus memanggil metode, lebih baik Anda membuat instance file Anda dengan jalur absolut. Ini harus melakukan trik:
File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();
Saya sarankan untuk mengelilinginya dengan blok coba-tangkap, BTW.
sumber
Untuk menggeneralisasi masalah, masalah muncul saat mengonversi URL / URI ke jalur lokal.
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
Semoga ini membantu.
sumber
Tanggapan yang baik semuanya. Saya telah menemukan ini tampaknya menjadi masalah dengan Java yang mengakses
C:
direktori root di Windows. Direktori lain seharusnya baik-baik saja, tetapi karena alasan tertentu, secara khusus menyebutkanC:\
atauC:
atauC:/
mungkin memberikan kesalahan. Saya telah menyelesaikan masalah yang sangat mirip ini dengan menjebak mention kenew File("C:");
dan menggantinya dengan yang baruFile(System.getProperty("file.separator"));
atau Anda harus dapat membuat kode keras "\" daripada mengatakan "c:" sebagai direktori file Anda dan mungkin berhasil. Tidak elegan, tetapi menyelesaikan pekerjaan untuk saya di proyek ini.Saya harap ini membantu. Mungkin bukan solusi yang tepat, tetapi setidaknya ini berhasil untuk saya. Saya aktif
JRE 1.6, Win 7
. Bersulang!Dengan hormat,
@Tukang kayu
sumber
Jika situasi di mana gagal melibatkan menjalankannya sebagai pengguna lain, dan Anda menggunakan Windows Vista / Windows 7, itu bisa disebabkan oleh VirtualStore, mekanisme di mana Windows membiarkan pengguna yang tidak berhak "menulis" tempat yang biasanya tidak bisa. Namun perubahan tersebut disimpan di "% USERPROFILE% \ AppData \ Local \ VirtualStore \" yang bersifat pribadi untuk setiap akun pengguna.
sumber
Ketika tidak ada dari atas yang berhasil untuk saya, saya mencoba
Ini akan membersihkan string Anda dari karakter yang tidak diinginkan
sumber
Saya baru-baru ini menemukan masalah yang sama. Apa yang saya lakukan adalah menghapus instalan Netbeans, menghapus folder netbeans dari drive C, file program, pembaruan, programData, hampir di mana saja. Kemudian instal ulang. Sekarang bekerja dengan baik. Jangan lupa untuk membuat cadangan folder proyek netbeans sebelum mengambil tindakan di atas.
Semoga membantu.
sumber
Dengan beberapa IDE (mungkin) dan atau dengan beberapa OS (mis .: window), secara default mereka tidak memiliki akses tulis pada file. Jadi jika Anda mencoba melakukan file.exists () itu akan menunjukkan Anda salah. untuk memperbaikinya, lakukan seperti di bawah ini
jika variabel ref Anda untuk File adalah f, contoh: File f = new File ("path");
jadi untuk membuatnya bekerja, pilih f dengan mouse dan kemudian pergi ke menu Search> Write access> Workspace. Semoga berhasil.
sumber
Saya pikir Anda harus menggunakan garis miring terbalik, seperti ini:
File file = File baru ("C: \\ User \\ utilities \\ data \\ someTextFile.txt"); (dua garis miring terbalik, bukan salah ketik)
Harus menyelesaikan masalah :)
sumber