Laman » bagaimana untuk » Mengapa Saya Tidak Boleh Mengubah Fail yang Digunakan di Windows Seperti Saya Bolehkah di Linux dan OS X?

    Mengapa Saya Tidak Boleh Mengubah Fail yang Digunakan di Windows Seperti Saya Bolehkah di Linux dan OS X?


    Apabila anda menggunakan Linux dan OS X, sistem pengendalian tidak akan menghalang anda daripada memadamkan fail yang kini digunakan pada Windows, anda akan dilarang daripada melakukannya. Apa yang memberi? Kenapa anda boleh mengedit dan memadam fail penggunaan dalam sistem yang dihasilkan oleh Unix tetapi bukan Windows?

    Sesi Soalan & Jawapan hari ini datang kepada kami dengan ihsan SuperUser-bahagian pembahagian Stack Exchange, kumpulan yang diketuai oleh komuniti laman web Q & A.

    Soalan

    Pembaca SuperUser the.midget ingin tahu mengapa Linux dan Windows merawat fail yang digunakan secara berbeza:

    Salah satu perkara yang menimbulkan kebingungan saya sejak saya mula menggunakan Linux adalah fakta bahawa ia membolehkan anda mengubah nama fail atau menghapusnya semasa sedang dibaca. Contohnya adalah bagaimana saya secara tidak sengaja cuba memadam video semasa ia sedang bermain. Saya berjaya, dan terkejut apabila saya mengetahui bahawa anda boleh mengubah apa sahaja dalam fail tanpa peduli jika ia digunakan pada masa ini atau tidak.

    Jadi apa yang berlaku di sebalik tabir dan menghalangnya dari memadamkan perkara-perkara di Windows seperti dia boleh di Linux?

    Jawapan

    Penyumbang SuperUser memberikan sedikit gambaran mengenai keadaan untuk pengguna. Kagum menulis:

    Setiap kali anda membuka atau menjalankan fail dalam Windows, Windows mengunci fail di tempatnya (ini adalah penyederhanaan, tetapi biasanya benar.) Fail yang dikunci oleh proses tidak boleh dihapuskan sehingga proses itu melepaskannya. Itulah sebabnya setiap kali Windows perlu mengemas kini sendiri, anda perlu reboot untuk melaksanakannya.

    Sebaliknya, sistem operasi seperti Unix seperti Linux dan Mac OS X tidak mengunci fail tetapi sebaliknya sektor cakera mendasar. Ini mungkin kelihatan pembezaan remeh tetapi ia bermakna bahawa rekod fail dalam jadual sistem fail kandungan boleh dipadam tanpa mengganggu mana-mana program yang sudah mempunyai fail terbuka. Jadi, anda boleh memadam fail semasa ia masih melaksanakan atau menggunakannya dan ia akan terus wujud pada cakera selagi beberapa proses mempunyai pemegang terbuka untuknya walaupun entrinya dalam jadual fail hilang.

    David Schwartz memperluaskan idea itu dan menyoroti betapa pentingnya perkara dan bagaimana mereka mempraktikkannya:

    Windows default kepada penguncian fail mandatori automatik. UNIXes lalai ke manual, penguncian fail koperasi. Dalam kedua-dua kes ini, mungkir boleh ditampal, tetapi dalam kedua-dua kes ini biasanya tidak.

    Banyak kod Windows lama menggunakan API C / C ++ (fungsi seperti fopen) dan bukan API asli (fungsi seperti CreateFile). API C / C ++ tidak memberi anda cara untuk menentukan bagaimana penguncian mandatori akan berfungsi, sehingga anda mendapat default. Mod "mod saham" lalai cenderung untuk melarang operasi "bertentangan". Jika anda membuka fail untuk menulis, menulis diandaikan konflik, walaupun anda tidak pernah menulis kepada fail tersebut. Ditto untuk rename.

    Dan, di sinilah semakin buruk. Selain pembukaan untuk membaca atau menulis, C / C ++ API tidak menyediakan cara untuk menentukan apa yang anda ingin lakukan dengan fail tersebut. Oleh itu API harus menganggap anda akan melakukan sebarang operasi undang-undang. Oleh kerana penguncian adalah wajib, terbuka yang membenarkan operasi yang bertentangan akan ditolak, walaupun kod tersebut tidak bertujuan untuk melaksanakan operasi yang bertentangan tetapi hanya membuka file untuk tujuan lain.

    Jadi jika kod menggunakan API C / C ++, atau menggunakan API asli tanpa memikirkan secara khusus mengenai isu-isu ini, mereka akan berhenti menghalang set operasi maksimum untuk setiap fail yang mereka buka dan tidak dapat membuka fail kecuali setiap kemungkinan operasi mereka boleh melaksanakan di atasnya sekali dibuka adalah tidak bercanggah.

    Pada pendapat saya, kaedah Windows akan berfungsi jauh lebih baik daripada kaedah UNIX jika setiap program memilih mod sahamnya dan mod terbuka dengan bijak dan dikendalikan dengan mudah. Kaedah UNIX, bagaimanapun, berfungsi lebih baik jika kod tidak mengganggu untuk memikirkan isu-isu ini. Malangnya, API C / C ++ asas tidak dipetakan dengan baik ke API fail Windows dengan cara yang mengendalikan mod saham dan bertentangan dengan baik. Jadi hasil bersihnya agak kemas.

    Di sana anda memilikinya: dua pendekatan berbeza untuk mengendalikan hasil hasil dua hasil yang berbeza.


    Mempunyai sesuatu untuk menambah penjelasannya? Bunyi dalam komen. Ingin membaca lebih banyak jawapan dari pengguna Stack Exchange yang berteknologi tinggi? Lihat thread perbincangan penuh di sini.