Bir dosya boyutu nasıl sıfır olabilir?


173

Sadece karşılaştığım ve uygun bir açıklama yapamadığım bir şey. Bilgisayarımda boş bir * .txt dosyası oluşturup daha sonra boyutuna bakarsak, 0 gösteriyor. Fakat bu nasıl mümkün olabilir? Demek istediğim, dosyanın kendisi boş olsa bile, sadece kendi adını saklamak için yine de bir boyuta sahip olmalı Bu nasıl açıklanabilir? (İşletim sistemine özgü değil)


81
dosya adı dosyada sayılmaz, nasıl açıklanabileceğini.
njzk2

123
Kolejde disk kotasını aşmak için dosya isimleri olarak dosya depolamak için bir yazılım parçası yazan bir arkadaşıma hatırlattım.
slebetman

15
@ColeJohnson 2000'li yıllarda U'mın bilgisayar laboratuarından birinde stajyerlik yaptım ve kullanıcı kotası dosya boyutlarının toplamı olarak hesaplandı. Dolayısıyla, verileri dosya adları olarak saklamak gerçekten de qouta'nın etrafında olur. Heck, bir programı klasörlere kaydedebilir ve kotanıza göre sayılmaz.
Mindwin

20
@slebetman Deha ve delilik arasındaki çizginin bulanıklaştığı nokta budur.
Pharap

10
Benzer bir teknik ünlü bir sıkıştırma mücadelesinde kullanıldı ,
Oddthinking

Yanıtlar:


202

Mümkün çünkü gerçekten dosya yok. Sadece bir isim ve sahibi olan bir dizin girişi var. Dizin girişi, dosyadan mantıksal olarak farklı. Örneğin, aynı dosya birden fazla dizinde birden fazla ada sahip olabilir.

Ne yazık ki, "dosya" terimi her zaman kesin olarak aynı şeyi ifade etmek için kullanılmaz. Ancak, dosya boyutu mantığı, bir dizin girişinin bir dizine "dosya" eklediği ve dosya adlarının ve ilgili meta verilerin dizinde depolandığı modelden gelir.


30
... aynı zamanda Hard Links olarak da bilinir.
Daniel B

6
Rehberde Aksi takdirde, aynı dosya iki klasördeyse ve onu bir adla değiştirirseniz, bu diğer dizini değiştirir ve bu da hiçbir anlam ifade etmez. Ayrıca, bu şekilde olmasaydı, bir dizinin içeriği ne olurdu ?!
David Schwartz

14
UNIX benzeri işletim sistemlerinde, FreeBSD ve Linux gibi bir dizinin boyutunu kolayca alabilirsiniz. Gibi komutlar ls -ld <directory>işe yarayacak.
David Schwartz

11
Bunun NTFS'nin geçerli sürümü için geçerli olup olmadığını bilmiyorum, ancak önceki sürümler (örneğin NT3.x'te) çok küçük dosyalar için verileri dizin girişinde depolar. Dosya tam anlamıyla mevcut olmazdı.
John Rennie

13
NTFS diğer dosya sistemlerinden çok farklı olmadığı sürece, hiçbir dosya olmadığı doğru değildir. Normal bir Unix dosya sisteminde, izinleri, mod zamanları vb. Depolayan bir inode olurdu. Dizin girişi hala bu inode'u ifade ediyor. Boş bir dosya ile boş olmayan bir dosya arasındaki tek fark, blokları ayırmak için işaretçidir. Boş bir dosya, blok haritası için NULL işaretçisinin dosya sistemine eşdeğer olmasına rağmen, herhangi bir veri bloğu olmadığını belirtir. Dizin girişleri, boş dosyalar için bile izinler ve mod zamanlarıyla karıştırılmaz. örneğin, XFS inode 256B'dir
Peter Cordes

82

"Dosya boyutu" nun anlamsal anlamı, kullandığınızdan farklıdır.

Anlamlı olan birçok dosya boyutu vardır. En sık rastlanan ve burada gördüğünüz "dosyadaki bayt sayısıdır". Dosya boş bir metin dosyasıysa, gerçekten 0 bayt içerebilir. Bu sayı, programcılar için önemlidir, çünkü genellikle bir dosyayı açmamız, "tüm verileri okumam" ve kapatmamız gerekir. Önümüzdeki planlamayı yapabilmemiz için dosyada kaç bayt veri olacağını bilmemiz gerekiyor.

Başka bir anlam da çoğu dosya sisteminin veri saklama biçiminden kaynaklanmaktadır. Çoğu dosya sistemi veriyi bloklar halinde saklar. Örneğin, dosya sistemi 64kB bloklarda veri depolayabilir, bu da 64kB'nin bile katı olmayan hiçbir şeyi asla tahsis etmeyeceği anlamına gelir. Bu, kulağa verimsiz geliyor, ancak defter tutma işlemini çok daha basit hale getirebilir ve çoğu zaman daha basit anlamına gelir.

Bağlandığınız üçüncü bir anlam, sabit disk sürücüsünde bir dosyanın varlığını tanımlamak için gereken gerçek bit sayısı olacaktır. Bu genellikle dosyadan ayrı olarak depolanan bilgileri içerir. Örneğin, Linux'ta "dosya adı" kavramı, dosyayı içeren dizin için inode'da saklanır (düzenleme: yorumlardan, teknik olarak bu, direktörün verilerinde saklanır. Bunu yazdığımda küçük -dizin durumu. 156 bayttan küçük veriler doğrudan inode'da saklanabilir). Bu yaygın olarak kullanılan bir anlam değildir, çünkü dosya sisteminizin muazzam derin iç çalışmalarını bilmeden belirlemek çok zordur (dosyadaki tüm izinleri saklamak için gereken alanı hesapladınız mı?). Ancak, 1.000.000 bayt sabit sürücünüz varsa,


2
"Dosyayı içeren dizine ait inode'da" İnode'dan değil, dizinin verisinden mi bahsediyorsun?
İnode

@Medinoc İyi nokta. Verileri inode içinde sakladığında satır içi durumu düşünüyordum, ama bunun ne kadar olabileceğini kontrol etmedim! Bir düzenleme ekledim.
Cort Ammon

İlgili satır içi veri özelliği Ext4'ün, bu hiç tüm dosya sistemleri arasında genele yayılmış değildir. Ek olarak, bu dizin değil, inode dosyaları için de geçerlidir. Bunlar ayrıdır, dizinler ayrıca satır içi veri yeteneğine sahiptir, ancak ayrı özelliklerdir. Bir dosya inode, en azından ext4 durumunda, belirli bir boyuta sahiptir, bu nedenle izinlerin veri kullanımı ilgisizdir. Bir dosya diski kullanımı, kullanılan dosya sistemine büyük ölçüde bağımlıdır, bu cevabın üçüncü kısmı yalnızca söyleyebildiğim kadarıyla ext4 için geçerlidir, bu açık değildir.
Phizes

8
1.000.000 baytlık bir sabit sürücünüz varsa, yükseltme hakkında düşünmeye başlamanın zamanı olabilir.
nekomatic

53

Dosya adı başka bir yerde saklanır.

Diskinizde üzerinde bir "dosya sistemi" olacaktır, dosya adlarının ve dosyaların fiziksel diskte nasıl temsil edildiğini ve yorumlanacağını seçmek için bir yöntem koyun.

Çoğu Windows disklerde sitesinde "NTFS" (Yeni Teknoloji Dosya Sistemi ") olarak adlandırılan bir dosya sistemi, ana dosya tablosu içinde bu depolar dosya bilgileri kullanarak olacaktır (MFT). Dosya içeriğinden ayrı Bkz ana dosya tablosu Wikipedia article .

Bu nedenle dosyanın kendisi 0 bayt uzunluğunda olacak, ancak MFT'ye girişi hala biraz yer kaplayacak.


11
NTFS durumunda, Windows ve çoğu araç tarafından bildirilen dosyanın boyutu aslında dosyanın içeriği olarak algıladığımız dosyanın ana akışının boyutudur . NTFS bölümünde depolanan dosya ek olarak, alternatif veri akışlarında depolanan bazı verilere sahip olabilir ve yine de raporlanan 0 büyüklüğünde olabilir . Bu tam bir resim :) yapmak istiyorsanız bilmek güzel dosya sistemi özellik
Pawel Bulwan

12

Bu oldukça ilginç bir ontolojik sorudur ...

Dosyanın kendisi dosyanın içeriğidir. Dosyanın içeriği yoksa, sıfır boyutundadır. Dosya adı, sizin adınız fiziksel olarak bir parçanız olduğu için (yani, değil) dosyanın bir parçasıdır.

Tıpkı sizin isminizi fiziksel olarak gösteren / işaret eden insanların kafasında (ve kendi kafanızda) bir fikir olarak mevcut olduğu gibi, dosya ismi de dosya sisteminin dizin ağacında bulunur ve dosyaya işaret eder / işaret eder.


7

(Cevabı biraz geç kaldı ...)

Bir dosyanın boyutu nasıl sıfır olabilir, yukarıdaki cevapların sağladığından biraz daha karmaşıktır. Soru Win7 olarak etiketlendi, ancak FAT veya NTFS gibi diğer "basit" dosya sistemlerine bakmak , kavramlar benzer olduğu için faydalı olabilir.

Disk bir dosyanın ne olduğunu ve dizinin ne olduğunu "bilmez"; tüm veriler küçük bloklar halindedir. İşletim sistemi veri bloklarının anlamlarını birbirinden ayırıyor. İlk birkaç özel, ancak blokların geri kalanı veriler hakkında bilgi tutar (örneğin: dosya adı, dosya uzunluğu, verileri tutan ilk veri bloğu) veya verilerin kendisi.

Bir dizin, işletim sisteminin anladığı "veri" nin, dosyaların içeriği değil, dosyalar hakkında bilgi içeren bir bilgi bloğu olduğu özel bir "dosya" dır. İyi bir benzetme fiziksel bir kütüphane ve kart kataloğudur. Bilgi bloklarını kart kataloğu ve rafları veri blokları olarak düşünün (kart kataloğu aynı zamanda rafa benzer bir yapıya oturur).

Bir dosyayı "UNIX touchkomutuyla söyler" ), işletim sistemi ilk önce bir bilgi bloğunda (dizin) bir giriş oluşturur:

  • Ad = My_File.txt
  • Uzunluk = 0
  • Veri Bloğu Başlat = N / A
  • Ek bilgi (sahip, izinler, oluşturulma / güncelleme / değiştirme tarihi) vb.

Yalnızca "yazmak" için bazı veriler varsa, verileri depolamak için boş bir veri bloğu bulmaya çalışır. Ancak veri blokları, diskin ulaşması ve işletim sisteminin okuması için uygun sabit boyutlarda (32K) gelir. Yalnızca "Merhaba" yazarsanız, bloğun çoğu "boştur" (aslında sıfır olmayabilir, ancak daha önce olanlardan kaynaklanan çöp) Dosya) böylece kötü şeyler alamazsınız.

"Dosya" yı bir uzunluk> blok boyutuna güncellediğinizde, işletim sistemi verileri yeni bloğa yazar ve bir birinci bloğu (ve benzeri) SONRASI SONRA yeni uzunluk (detaylar farklı).

Sonunda, veri bloklarının zincirleri (dosya içerikleri) hakkında bilgi içeren bir bilgi veri blokları (dizinler veya listeler) topluluğudur.

Mantıksal olarak, bu aynı zamanda, bir dosya neden uzun süre yanıp sönerken aynı dosya sistemindeki bir dosyanın taşınmasının neden hızlı yanıp söndüğünü de açıklar. İşletim sistemi, girişi bir dizinden (bilgi veri bloğu) kaldırmak ve diğerine eklemek için yalnızca 2 dizin bloğunu düzenlemelidir. Bir dosyayı silin: yeniden ayrılacak dosya veri bloklarını serbest bırakarak, dizin bloğundaki girişi kaldırın.

ps: Kart kataloğunun bir kitap için girişi olması, rafta olduğu anlamına gelmez (belki de teslim alınmış veya kaybolmuş olabilir); dosya boyutu 0.

pps: Kitaplığın içindeki yanlış yerleştirilmiş bir kitap arama kitaplığını ya da bilgisayar terimlerini ifade eder: chkdsk ya da disk tamir!

UNIX inode'larını okuyarak veya sürüm kontrol sistemlerinin (ClearCase, TFS, Git vb.) Yalnızca dosyaları ve dizinleri değil aynı zamanda dosyaların sürümlerini ve hatta dizin sürümlerini nasıl yönettiğini takdir ederek daha iyi bir anlayış elde edilebilir. Çoğu durumda, her şey bir veritabanında saklanır ve klasik dizin yapısı ve dosyalar olarak görünmesi için kullanıcıya sunulur!


4

Burada bazı mükemmel cevaplarımız var - sadece resim versiyonunu ekleyeceğim (bin kelime ve hepsi.)

NTFS biçimli sabit disklerimden biri, bir disk birleştirme aracıyla görselleştiriyorsanız budur. MFT (Master File Table) menekşe gösterilir:

görüntü tanımını buraya girin

Bu küçük menekşe karesi HD'mde bulunan dosyaların listesini açıklar. Kısacası, bir NTFS diski için, İçindekiler kitabının kitap için anlamı nedir; sayfalar yerine, diskin 1 üzerindeki fiziksel konumlarını gösterir .

Sıfır bayt büyüklüğünde bir dosya, hiçbir sayfayı göstermeyen bir İçindekiler girişi olarak görselleştirilebilir:

görüntü tanımını buraya girin

Giriş orada listelenmiştir - ancak hiçbir sayfa gösterilmediğinden, içeriğin bulunmadığını varsayabiliriz.

1 - Elbette, bundan biraz daha karmaşık; ancak sektör haritaları, ayna MFT'ler, vb. gibi noktalar bu soruların kapsamı dışındadır.


3

Dosya sistemleri , dosya adı, dosya boyutu, oluşturma süresi, erişim süresi, değiştirilen süre, oluşturulan kullanıcı, kullanıcı ve grup izinleri, parçalar, dosyayı depolayan kümelere işaretçi, sabit / yumuşak bağlantılar, öznitelikler gibi bir dosya hakkında çok fazla bilgi depolar. ... Bunlara dosya meta verileri denir . Kullanıcılar onları önemsemediğinde ve onlarla ilgilenmediğinde neden bu meta verileri dosya boyutuna sayıyorsun? Yalnızca dosya içeriğini önemsiyorlar

Ayrıca, her dosya sistemi diskte farklı miktarlarda alan alan farklı türde meta veri depolar . Örneğin POSIX izinleri NTFS izninden çok farklıdır ve inodePOSIX'te Windows'ta bulunmayan numaralar da vardır. POSIX dosya sistemleri bile, 32-bit blok adresli ext3, 48-bit ext4, 64-bit Btrfs ve 128-bit adresli ZFS gibi değişkenlik gösterir. Peki bu meta verileri dosya boyutuna nasıl sayacaksınız?

Geçerli veri sisteminde meta verileri 56 bayt tüketen 100 baytlık bir dosyayla başka bir örnek alın. Dosyayı başka bir dosya sistemine kopyaladık ve şimdi 128 bayt meta veri alıyor. Ancak, dosya içerikleri tamamen aynıdır , dosyalardaki bayt sayısı da aynıdır. Bu nedenle, dosya boyutunu sistemde 156 bayt, ancak diğerlerinde 228 bayt görüntülemek çok kafa karıştırıcı ve sezgiseldir .


1

Bir dosya boyutu, 0söylemeye benzer: 5Üzerinde kelimeler olan bir kağıt var. Ve başka bir kağıt üzerinde, üzerinde 0kelimeler var. Yani 0tamamen mümkündür.

Dosyanın meta verileri (oluşturulma tarihi, son değiştirilme tarihi, dosya sahibi, izinler), dosya boyutunun bir parçası olarak dahil edilmeyen ve saklanmadığı yerlerdir.


0

Basit bir şekilde anlayın ... bir dosya oluşturduğunuzda ... sağladığınız dosya adıyla tanımlanan dosyanın hafıza konumu için bir işaretçi olarak çalışan bir dizin girişi vardır. Daha fazla işaretçi oluşturduğunuzda veya dosya söylediğinizde dizinin boyutu artar .. dosya boyutu yalnızca sivri bir yere, yani dosyanın içine veri koyarsanız artar. O zamana kadar boyut sıfır olacak. :)


Bu gerçekten bir yorum - bir cevap değil - ve sadece diğerlerinin söylediklerini tekrarlıyor.
JakeGould

0

Demek böyle çalışıyor:

Birim üzerinde herhangi bir dosyayı oluşturduğunuz anda, NTFS mata dosyasında yani $ MFT'de (Ana dosya tablosu) bir dosya kaydı oluşturur. MFT'de bir FRS (Dosya kayıt segmenti) bulunduğundan bir kayıt göreceksiniz. NTFS FileSystem olması durumunda, her dosya kaydı varsayılan olarak 1 KB boyutundadır. Ancak bu alan yalnızca dosyanın içinde bazı bilgiler saklarsanız talep edilir. Bir metin dosyası olduğu düşünüldüğünde sadece "a" harfini yazmanıza rağmen, FRS'nin varsayılan boyutu olduğu için 1 KB alan talep edecek. "A" harfi, bir ADS (Alternatif Veri Akışı) yoksa, tüm verinizin gittiği bir özellik olan bu FRS'nin varsayılan ve adsız veri akışına gider.

Herhangi bir sorunuz olursa bana bildirin.

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.