If-Koubou

Mengapa Saya Tidak Dapat Mengubah File yang Sedang Digunakan di Windows Seperti yang Dapat Saya Lakukan di Linux dan OS X?

Mengapa Saya Tidak Dapat Mengubah File yang Sedang Digunakan di Windows Seperti yang Dapat Saya Lakukan di Linux dan OS X? (Bagaimana caranya)


Ketika Anda menggunakan Linux dan OS X, sistem operasi tidak akan menghentikan Anda dari menghapus file yang sedang digunakan namun pada Windows Anda akan secara tegas dilarang melakukannya. Apa yang memberi? Mengapa Anda dapat mengedit dan menghapus file yang sedang digunakan pada sistem yang diturunkan Unix tetapi bukan Windows?

Sesi Tanya & Jawab hari ini hadir untuk memberi kami hak milik SuperUser-sub divisi Stack Exchange, pengelompokan situs web Q & A berbasis komunitas.

Pertanyaan

SuperUser reader the.midget ingin tahu mengapa Linux dan Windows memperlakukan file yang digunakan secara berbeda:

Salah satu hal yang membuat saya bingung sejak saya mulai menggunakan Linux adalah fakta bahwa ini memungkinkan Anda untuk mengubah nama file atau bahkan menghapusnya ketika sedang dibaca. Contohnya adalah bagaimana saya tidak sengaja mencoba menghapus video saat sedang diputar. Saya berhasil, dan terkejut ketika saya mengetahui bahwa Anda dapat mengubah apa saja dalam file tanpa peduli jika digunakan saat ini atau tidak.

Jadi apa yang terjadi di balik layar dan mencegahnya menghapus hal-hal yang tidak diinginkan di Windows seperti yang dia dapat di Linux?

Jawabannya

Kontributor SuperUser memberi penjelasan tentang situasi ini. Kagum menulis:

Setiap kali Anda membuka atau mengeksekusi file di Windows, Windows mengunci file di tempat (ini adalah penyederhanaan, tetapi biasanya benar.) File yang dikunci oleh suatu proses tidak dapat dihapus sampai proses itu melepaskannya. Inilah sebabnya mengapa setiap kali Windows harus memperbarui sendiri Anda perlu reboot untuk itu berlaku.

Di sisi lain, sistem operasi mirip Unix seperti Linux dan Mac OS X tidak mengunci file melainkan sektor disk yang mendasarinya. Ini mungkin tampak sebagai pembedaan sepele tetapi itu berarti bahwa catatan file dalam daftar isi sistem file dapat dihapus tanpa mengganggu program yang sudah memiliki file terbuka. Jadi Anda dapat menghapus file saat masih dieksekusi atau sedang digunakan dan akan terus ada di disk selama beberapa proses memiliki pegangan terbuka untuk itu meskipun entri dalam tabel file hilang.

David Schwartz memperluas ide dan menyoroti bagaimana hal-hal harus idealnya dan bagaimana praktiknya:

Windows default untuk penguncian file otomatis dan wajib. UNIXes default untuk penguncian file secara manual dan kooperatif. Dalam kedua kasus, default dapat ditimpa, tetapi dalam kedua kasus itu biasanya tidak.

Banyak kode Windows lama menggunakan C / C ++ API (berfungsi seperti fopen) daripada API asli (berfungsi seperti CreateFile). C / C ++ API memberi Anda tidak ada cara untuk menentukan bagaimana penguncian wajib akan bekerja, sehingga Anda mendapatkan default. "Mode berbagi" default cenderung melarang operasi "konflik". Jika Anda membuka file untuk menulis, menulis diasumsikan konflik, bahkan jika Anda tidak pernah benar-benar menulis ke file. Ditto untuk mengganti nama.

Dan, di sinilah semakin buruk. Selain membuka untuk membaca atau menulis, C / C ++ API tidak memberikan cara untuk menentukan apa yang ingin Anda lakukan dengan file tersebut. Jadi API harus menganggap Anda akan melakukan operasi hukum apa pun. Karena penguncian bersifat wajib, sebuah operasi terbuka yang memungkinkan operasi yang bertentangan akan ditolak, bahkan jika kode tidak pernah dimaksudkan untuk melakukan operasi yang bertentangan tetapi hanya membuka file untuk tujuan lain.

Jadi jika kode menggunakan API C / C ++, atau menggunakan API asli tanpa secara khusus memikirkan masalah ini, mereka akan berakhir mencegah set maksimum operasi yang mungkin untuk setiap file yang mereka buka dan tidak dapat membuka file kecuali setiap kemungkinan operasi mereka bisa tampil di atasnya sekali dibuka tidak berubah.

Menurut pendapat saya, metode Windows akan bekerja jauh lebih baik daripada metode UNIX jika setiap program memilih mode berbagi dan membuka mode dengan bijaksana dan dengan hati-hati menangani kasus kegagalan. Metode UNIX, bagaimanapun, bekerja lebih baik jika kode tidak repot-repot memikirkan masalah ini. Sayangnya, C / C ++ API dasar tidak memetakan dengan baik ke API file Windows dengan cara yang menangani mode berbagi dan konflik terbuka dengan baik. Jadi hasil bersihnya agak sedikit berantakan.

Di sana Anda memilikinya: dua pendekatan berbeda untuk penanganan file menghasilkan dua hasil yang berbeda.

Memiliki sesuatu untuk ditambahkan ke penjelasan? Bicaralah di komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang paham teknologi lainnya? Lihat diskusi lengkap di sini.