Neden Windows'ta okunmakta olan bir dosyanın adını Linux / Mac'te olduğu gibi değiştiremiyorum?


23

Linux'u kullanmaya başladığımdan beri beni şaşırtan şeylerden biri, bir dosyanın adını değiştirmenize veya okunurken bile silmenize izin vermesidir. Örnek olarak, bir videoyu oynatırken yanlışlıkla silmeye çalıştım. Başarılı oldum ve şu anda kullanılıyor olsun veya olmasın, bir dosyadaki herhangi bir şeyi hemen hemen değiştirebildiğinizi öğrendiğim için şaşırdım.


2
Kilitli bir dosyayı yeniden adlandırmak Windows'ta sorun değil. Genellikle silme, FILE_SHARE_DELETE seçeneği açıkken bir dosyayı açan birkaç programdır.
Hans Passant

Aslında silmediniz, sadece içinde bulunduğu dizinden bağlantısını kaldırdınız. Dosya hala var, dosya sisteminde herhangi bir isim olmayabilir. ( /procAçık olan program aracılığıyla dosya sisteminde hala bir isim olsa da .) Bir dosya ancak kendisine hiçbir referans kalmamışsa gerçekten silinebilir ve bu otomatik olarak gerçekleşir.
David Schwartz

Yanıtlar:


36

Windows'ta bir dosyayı açtığınızda veya çalıştırdığınızda, Windows dosyayı yerinde kilitler (bu bir basitleştirmedir, ancak genellikle doğrudur.) Bir işlem tarafından kilitlenen bir dosya bu işlem yayınlanıncaya kadar silinemez. Bu nedenle, ne zaman Windows kendisini güncellemek zorunda olursa, etkinleşmesi için yeniden başlatmanız gerekir.

Öte yandan, Linux ve Mac OS X gibi Unix benzeri işletim sistemleri, dosyayı değil, temeldeki disk sektörlerini kilitler. Bu önemsiz bir farklılaşma gibi görünebilir ancak bu, dosyanın dosya sistemi içindekiler tablosundaki kaydının, dosyayı önceden açmış olan herhangi bir programı bozmadan silebileceği anlamına gelir. Böylece, bir dosyayı hala yürütülürken veya başka bir şekilde kullanımdayken silebilirsiniz ve bazı işlemler dosya tablosundaki girişi gitmiş olsa bile, bunun için açık bir tanıtıcı olduğu sürece diskte var olmaya devam edecektir.


2
Bu cevap için teşekkürler. Bu bana farkı çok daha fazla açıklıyor. Ayrıca, büyük dosya / videoların yüklenmesinin neden çok miktarda RAM gerektirmediğini de açıklar. Aksi takdirde, büyük bir video oynatmak tüm sisteminizi yavaşlatabilir.
Jerry Saravia

4
Kullanımda olan bir dosyayı sildiyseniz ve Linux'ta geri almak istiyorsanız, bu soruda açıklandığı şekilde dosyanın girişini / proc içinde bulabilirsiniz .
Ken Bloom,

2
Bu bir genellemedir - bugünlerde Windows güncellemelerinin tümü (Windows 7'de) yeniden başlatılması gerekmiyor ve ben de Linux'ta çok şey yaptım.
Alan B

10

Windows varsayılan, otomatik, zorunlu dosya kilitleme şeklindedir. UNIX varsayılan olarak manuel, işbirlikçi dosya kilitlemeyi önler Her iki durumda da, varsayılanlar geçersiz kılınabilir, ancak her iki durumda da genellikle değildir.

Birçok eski Windows kodu fopen, yerel API (işlevler gibi CreateFile) yerine C / C ++ API'sini (benzeri işlevler ) kullanır. C / C ++ API, zorunlu kilitlemenin nasıl çalışacağını belirlemenize olanak sağlamaz, böylece varsayılan ayarları alırsınız. Varsayılan "paylaşım modu", "çakışan" işlemleri yasaklamaya meyillidir. Yazmak için bir dosya açarsanız, dosyalara hiç yazmamış olsanız bile yazıların çakışacağı varsayılır. Adları için Aynen.

Ve işte daha da kötüye gittiği yer. Okuma veya yazma için açılış dışında, C / C ++ API dosyası ile ne yapmak istediğinizi belirtmek için bir yol sağlar. Dolayısıyla, API herhangi bir yasal işlem gerçekleştireceğinizi varsaymalıdır. Kilitleme zorunlu olduğundan, bir openo verir Çakışan işlem kodu çelişkili işlemi gerçekleştirmek için tasarlanmıştır ancak sadece başka bir amaç için bir dosya açıyordu asla bile, reddedilecektir.

Bu nedenle, kod C / C ++ API'sini kullanıyorsa veya yerel API'yi bu sorunları özellikle düşünmeden kullanıyorsa, açtıkları her dosya için maksimum olası işlem kümesini önler ve mümkün olan her işlem dışında bir dosyayı açamaz açıldığında sorunsuz olabilir.

Bence, her program kendi paylaşım modlarını ve açık modları akıllıca ve akıllıca ele alan arıza durumlarını seçtiyse, Windows yöntemi UNIX yönteminden çok daha iyi sonuç verir. Bununla birlikte, UNIX yöntemi, kod bu konular hakkında düşünmeye zahmet etmiyorsa daha iyi çalışır. Ne yazık ki, temel C / C ++ API'si Windows dosya API'si üzerinde paylaşım modlarını idare edecek şekilde çakışmıyor ve çakışıyorsa iyi açılıyor. Yani net sonuç biraz dağınık.


0

Bu çok ilginç bir soru ve uygulanabilir bir cevap hakkında düşünmemi sağladı. Umarım diğerleri burada destek sağlayabilir.

Hem Windows hem de Linux kullanıyorum ve bunu da farkettim. Ben de bir vim kullanıcısıyım. Vim, bir metin dosyasını bir 'arabellek' veya RAM içine okuyacak ve siz kaydedene kadar gerçek dosyaya dokunmayacaktır. Linux bu eylemi genel olarak tüm dosyalarda gerçekleştiriyor olabilir.

Örneğin, videonuzu çekin, mümkünse hepsini RAM'e ekleyin ve ardından kolayca erişilebilir, aranabilir, atlanabilir bir videonun kopyasını alın. Dosya çok büyükse, o zaman sorun yaşayabilirsiniz çünkü Linux tüm videoyu okumaz, belki de büyük bir yığın. Oynatıcınız arabelleğe alınan videonun sonuna geldiğinde dosyayı tekrar okumayı dener. Videoyu sildiyseniz, bu sizin için berbattır.

Windows bazı durumlarda çok daha güvenli bir işletim sistemidir, çünkü bunu yapmanıza izin vermez. Dosyaları, Linux'ta olduğu gibi tamponlayabilir, ancak üzerinde çalıştığınız veya değiştirdiğiniz dosyaları değiştirmenizi engellemek için dosya kilitlemeyi de ekler. Bu, dosyanın sağlam kalmasına yardımcı olur ve sizi veya diğer programları birbirlerinin değişikliklerinin üzerine yazmasını önler.


Gerçekten silemezsin . Sadece hareket ettirin ve yeniden adlandırın.
Daniel Beck

2
'Rm' yapabilirsiniz. Bu onu silmek için yeterince yakın.
Chris Moore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.