17Aug

Neden Linux ve OS X'te Kullanılabilir Dosyaları Windows'da Değiştirmem mümkün mü?


Linux ve OS X kullanırken işletim sistemi, şu anda kullanımda olan bir dosyayı silmenizi durdurmaz, Windows'ta açıkça yasaklanırsınız. Ne veriyorNeden Unix türevi sistemlerde, ancak Windows'da olmayan kullanımdaki dosyaları düzenleyebilir ve silebilirsiniz?

Bugünkü Soru &Cevap oturumu bize Q & A web sitelerinin topluluk temelli bir gruplandırması olan Stack Exchange'in bir alt bölümü olan SuperUser sayesinde sağlanır.

Soru

SuperUser okuyucu the.midget, Linux ve Windows'un neden kullanımdaki dosyaları farklı işlediğini bilmek istemektedir:

Linux kullanmaya başladığımdan beri şaşkınlık duyduğum şeylerden biri, dosyanın adını değiştirmenize izin verdiği gerçeğidir.bir dosya veya hatta okunurken silin. Bir örnek, yanlışlıkla bir videoyu oynatırken silmeyi nasıl denediğimdir. Başardı ve şu an kullanılıp kullanılmadığını önemsemeden dosyalardaki herhangi bir şeyi değiştirebileceğinizi öğrendiğimde şaşırdım.

Peki sahnelerin arkasında neler oluyor ve Linux'ta yapabileceği şeyleri Windows'da istemeden silmekten alıkoyuyor mu?

Cevap

SüperKullanıcı katkıda bulunanlar, themidget'ın durumuyla ilgili biraz ışık tuttu.İnanılmaz yazılar:

Windows'da bir dosyayı açtığınızda veya yürüttüğünüzde, Windows dosyayı yerine kilitler( bu bir sadeleştirme, ancak genelde doğrudur.) Bir süreç tarafından kilitlenen bir dosya bu işlem serbest bırakılıncaya kadar silinemez. Windows'un kendini güncellemesi gerektiği zaman bunun geçerli olması için yeniden başlatmanız gerekir.

Öte yandan, Linux ve Mac OS X gibi Unix benzeri işletim sistemleri dosyayı kilitlemez, bunun yerine alttaki disk sektörlerini kilitler. Bu önemsiz bir farklılaşma gibi görünebilir, ancak dosya sistemindeki içindekiler tablosundaki dosyanın kaydının, zaten dosyanın açık olduğu herhangi bir programı bozmadan silinebileceği anlamına gelir. Dolayısıyla bir dosyayı hala yürütürken veya başka bir şekilde kullanırken silebilirsiniz ve dosya tablosundaki girişi kaybolmuş olsalar bile, bazı işlemler için açık bir tanıtıcı olduğu sürece diskte var olmaya devam edecektir.

David Schwartz bu fikri genişletir ve işlerin nasıl ideal bir biçimde ve nasıl yürüteceğini vurgular:

Windows varsayılan olarak otomatik, zorunlu dosya kilitli durumdadır. UNIX varsayılan olarak manuel, kooperatif dosya kilitleme. Her iki durumda da, varsayılanlar geçersiz kılınabilir, ancak her iki durumda da genellikle geçerli değildir.

Eski bir Windows kodu birçoğu, yerel API( CreateFile gibi işlevler) yerine C / C ++ API'sini( fopen gibi işlevler) kullanır. C / C ++ API, varsayılanları alabilmeniz için zorunlu kilitlemenin nasıl çalışacağını belirtmenin hiçbir yolunu sunmaz. Varsayılan "paylaşım modu", "çakışan" işlemleri yasaklama eğilimindedir. Yazılacak bir dosyayı açarsanız, aslında dosyaya hiç yazmazsanız da, yazmaların çakıştığı varsayılır. Adlarını değiştirmek için.

Ve işte burada daha da kötüye gidiyor. Okuma veya yazma için açma dışında, C / C ++ API, dosyayla ne yapmak istediğinizi belirtmenin hiçbir yolu yoktur. Dolayısıyla API, herhangi bir hukuki işlemi gerçekleştireceğinizi varsaymak zorundadır. Kilitleme zorunlu olduğu için, çakışan işlemi gerçekleştirmeyi amaçlamamış olsa da ancak dosyayı başka bir amaçla açmış olsa bile, çakışan bir işlemi mümkün kılan bir açıklama reddedilecektir.

Dolayısıyla kod, C / C ++ API'sini kullanıyorsa veya yerel API'yı bu konularda özel olarak düşünmeden kullanıyorsa, mümkün olan her işlem için açtıkları ve açamayacakları her dosya için mümkün olan en fazla işlemi engelleyecektirAçıldıklarında tekrar edilebilecekler.

Bana göre, Windows yöntemi, her program paylaşım modlarını ve açık modlarını akıllıca ve sanely tarafından başarısızlık olaylarıyla işlendiyse, UNIX yönteminden çok daha iyi çalışacaktır. Ancak UNIX metodu, kodun bu konularda düşünmeye isteksiz olması durumunda daha iyi sonuç verir. Ne yazık ki, temel C / C ++ API, Windows dosya API'sine, paylaşım modlarını işleyecek ve çakışan açılımları iyi bir şekilde eşleyemez. Net sonuç biraz dağınık.

İşte var: dosya işleme için iki farklı yaklaşım, iki farklı sonuç doğuruyor.

Açıklamaya eklemek için bir şey var mı?Açıklamalarda ses çıkıyor. Diğer teknik uzman Stack Exchange kullanıcılarından daha fazla cevap okumak ister misiniz? Buradaki tam tartışma dizinine göz atın.