Linux menghapus file yang sama sekali berbeda dari cara Windows. Pertama, penjelasan singkat tentang bagaimana file dikelola di * sistem file asli unix.
File disimpan di disk dalam struktur bertingkat yang disebut i-node
. Setiap i-node memiliki nomor unik pada sistem file tunggal. Struktur i-simpul menyimpan informasi yang berbeda tentang file, seperti ukurannya, blok data yang dialokasikan untuk file dll, tetapi untuk kepentingan jawaban ini elemen data yang paling penting adalah a link counter
. The directories
adalah file yang menyimpan catatan tentang file. Setiap catatan memiliki nomor i-simpul yang dimaksud, panjang nama file dan nama file itu sendiri. Skema ini memungkinkan seseorang untuk memiliki 'pointer', yaitu 'tautan' ke file yang sama di tempat yang berbeda dengan nama yang berbeda. Penghitung tautan dari i-simpul sebenarnya menyimpan jumlah tautan yang merujuk ke simpul-i ini.
Apa yang terjadi ketika beberapa proses membuka file? Pertama open()
fungsi mencari catatan file. Kemudian memeriksa apakah struktur i-node di memori untuk i-node ini sudah ada. Ini dapat terjadi jika beberapa aplikasi sudah membuka file ini. Jika tidak, sistem menginisialisasi struktur i-simpul di memori baru. Kemudian sistem meningkatkan penghitung terbuka struktur i-simpul di memori dan kembali ke aplikasi deskriptor file-nya.
Panggilan perpustakaan Linux untuk menghapus file disebut unlink
. Fungsi ini menghapus catatan file dari direktori dan mengurangi penghitung tautan i-node. Jika sistem menemukan bahwa struktur simpul-i dalam memori ada dan penghitung terbukanya tidak nol maka panggilan ini mengembalikan kontrol ke aplikasi. Kalau tidak, ia memeriksa apakah penghitung-tautan menjadi nol dan jika tidak maka sistem membebaskan semua blok yang dialokasikan untuk i-simpul dan i-simpul itu sendiri dan kembali ke aplikasi.
Apa yang terjadi ketika aplikasi menutup file? Fungsi close()
menurunkan counter terbuka dan memeriksa nilainya. Jika nilainya tidak nol, fungsi kembali ke aplikasi. Kalau tidak memeriksa apakah penghitung tautan i-simpul adalah nol. Jika nol, ia membebaskan semua blok file dan simpul-i sebelum kembali ke aplikasi.
Mekanisme ini memungkinkan Anda untuk "menghapus" file saat dibuka. Pada saat yang sama aplikasi yang membuka file masih memiliki akses ke data dalam file. Jadi, JRE, dalam contoh Anda, masih membuat versi file dibuka sementara ada versi lain yang diperbarui pada disk.
Terlebih lagi, fitur ini memungkinkan Anda untuk memperbarui glibc (libc) - perpustakaan inti semua aplikasi - di sistem Anda tanpa mengganggu operasi normalnya.
Windows
20 tahun yang lalu kami tidak tahu sistem file selain FAT di DOS. Sistem file ini memiliki struktur dan prinsip manajemen yang berbeda. Prinsip-prinsip ini tidak memungkinkan Anda untuk menghapus file ketika dibuka, jadi DOS dan Windows baru-baru ini harus menolak permintaan penghapusan pada file yang terbuka. Mungkin NTFS akan memungkinkan perilaku yang sama dengan sistem file * nix tetapi Microsoft memutuskan untuk mempertahankan perilaku kebiasaan penghapusan file.
Ini jawabannya. Tidak pendek, tetapi sekarang Anda punya ide.
Sunting : Bacaan yang bagus tentang sumber-sumber Win32
kekacauan: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Kredit ke @Jon
ren MonsterB.jar MonsterB.ja_
- itu seharusnya bekerja. Ini berfungsi untuk file dll dan exe pasti.fopen
memanggilCreateFile
denganFILE_SHARE_DELETE
flag, jadi ia melarangnya untuk sebagian besar program yang membuka file.