17Aug

Mengapa Saya Tidak Bisa Mengubah File Yang Ada di Windows Seperti Saya Bisa di Linux dan OS X?


Bila Anda menggunakan Linux dan OS X, sistem operasi tidak akan menghentikan Anda untuk menghapus file yang saat ini digunakan pada Windows Anda akan dilarang melakukannya. Apa yang memberiMengapa Anda bisa mengedit dan menghapus file dalam penggunaan pada sistem yang diturunkan dari Unix tapi bukan Windows?

Pertanyaan Hari Ini &Sesi jawaban datang kepada kami atas izin SuperUser - subdivisi dari Stack Exchange, pengelompokan berbasis komunitas dari Q & A situs web.

Pertanyaan

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

Salah satu hal yang membingungkan saya sejak saya mulai menggunakan Linux adalah kenyataan bahwa hal itu memungkinkan Anda mengubah namasebuah file atau bahkan menghapusnya saat sedang dibaca. Contohnya adalah bagaimana saya secara tidak sengaja mencoba menghapus video saat sedang diputar. Saya berhasil, dan terkejut saat mengetahui bahwa Anda dapat mengubah apa saja dalam file tanpa mempedulikan apakah sedang digunakan saat ini atau tidak.

Jadi, apa yang terjadi di balik layar dan mencegahnya untuk tidak menghapus hal-hal di Windows seperti yang dia bisa di Linux?

Jawaban Kontributor

SuperUser memberi penjelasan tentang situasi untuk the.midget. Kagum menulis:

Kapan pun Anda membuka atau menjalankan file di Windows, Windows mengunci file di tempat( ini adalah penyederhanaan, tapi biasanya benar.) File yang terkunci oleh sebuah proses tidak dapat dihapus sampai proses itu melepaskannya. Inilah sebabnya mengapa setiap kali Windows harus memperbarui dirinya sendiri Anda memerlukan reboot agar bisa diterapkan.

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

David Schwartz memperluas gagasan tersebut dan menyoroti bagaimana segala sesuatunya 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 di overriden, namun dalam kedua kasus biasanya tidak.

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

Dan, di sinilah keadaan semakin memburuk. Selain membuka untuk membaca atau menulis, C / C ++ API tidak menyediakan cara untuk menentukan apa yang ingin Anda lakukan dengan file tersebut. Jadi API harus menganggap Anda akan melakukan operasi hukum apa pun. Karena penguncian itu wajib, sebuah tindakan terbuka yang memungkinkan operasi yang bertentangan akan ditolak, meskipun kode tersebut tidak pernah dimaksudkan untuk melakukan operasi yang bertentangan namun hanya membuka file tersebut untuk tujuan lain.

Jadi, jika kode menggunakan API C / C ++, atau menggunakan API asli tanpa memikirkan secara spesifik masalah ini, mereka akan mengakhiri kemungkinan set maksimum operasi yang mungkin untuk setiap file yang mereka buka dan tidak dapat membuka file kecuali setiap kemungkinan operasiMereka bisa tampil di sana begitu dibuka tidak terkoneksi.

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

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

Punya sesuatu untuk ditambahkan ke penjelasannya? Terdengar dalam komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange tech-savvy lainnya? Simak thread diskusi selengkapnya disini.