Bagaimana ukuran file menjadi nol?

173

Hanya sesuatu yang saya temui dan tidak bisa memikirkan penjelasan yang tepat. Jika saya membuat file * .txt kosong pada PC saya dan kemudian melihat ukurannya, itu menunjukkan 0. Tapi bagaimana itu mungkin? Maksud saya bahkan jika file itu sendiri kosong, masih harus memiliki beberapa ukuran, hanya untuk menyimpan namanya sendiri. Bagaimana ini bisa dijelaskan? (Non OS spesifik)

Eugene S
sumber
81
nama file tidak dihitung dalam file, itu bagaimana hal itu dapat dijelaskan.
njzk2
123
Saya teringat akan seorang teman di kampus yang menulis perangkat lunak untuk menyimpan teks sebagai nama file untuk mendapatkan kuota disk.
slebetman
15
@ColeJohnson Saya magang di tahun 2000-an di salah satu lab komputer U saya, dan kuota pengguna dihitung sebagai jumlah filesizes. Jadi menyimpan data sebagai nama file memang akan menyiasati qouta. Heck Anda dapat menyimpan program di folder dan itu tidak akan dihitung terhadap kuota Anda.
Mindwin
20
@slebetman Ini adalah titik di mana garis antara kejeniusan dan kegilaan menjadi kabur.
Pharap
10
Teknik serupa terkenal digunakan dalam tantangan kompresi ,
Oddthinking

Jawaban:

202

Itu mungkin karena memang tidak ada file. Hanya ada entri direktori dengan nama dan pemilik. Entri direktori secara logis berbeda dari file. Sebagai contoh, file yang sama dapat memiliki lebih dari satu nama di lebih dari satu direktori.

Sayangnya, istilah "file" tidak selalu digunakan untuk maksud hal yang persis sama. Tetapi logika ukuran file berasal dari model di mana entri direktori "melampirkan" file ke direktori dan nama file dan metadata terkait disimpan di direktori.

David Schwartz
sumber
30
... juga dikenal sebagai Hard Links.
Daniel B
6
Dalam direktori. Kalau tidak, jika file yang sama ada di dua direktori dan Anda menamainya menjadi satu, itu akan mengubah direktori lain, yang tidak masuk akal sama sekali. Juga, seandainya tidak seperti ini, apa isi direktori?
David Schwartz
14
Pada kebanyakan OS mirip UNIX, seperti FreeBSD dan Linux, Anda dapat dengan mudah mendapatkan ukuran direktori. Perintah seperti ls -ld <directory>akan bekerja.
David Schwartz
11
Saya tidak tahu apakah ini benar untuk versi NTFS saat ini, tetapi versi awal (misalnya pada NT3.x) akan menyimpan data untuk file yang sangat kecil dalam entri direktori. File tersebut benar-benar tidak ada.
John Rennie
13
Tidak sepenuhnya benar bahwa tidak ada file, kecuali NTFS sangat berbeda dari sistem file lain. Pada sistem file Unix yang normal, akan ada inode yang menyimpan izin, mod-times, dan sebagainya. Entri direktori masih mengacu pada inode ini. Satu-satunya perbedaan antara file kosong dan file tidak kosong adalah pointer untuk mengalokasikan blok. File kosong memiliki sistem file yang setara dengan pointer NULL untuk peta bloknya, untuk menunjukkan bahwa ia tidak memiliki blok data apa pun. Entri direktori tidak berantakan dengan izin dan waktu mod, bahkan untuk file kosong. misalnya inode XFS adalah 256B
Peter Cordes
82

Arti semantik "ukuran file" berbeda dari yang Anda gunakan.

Ada banyak ukuran file yang bermakna. Yang paling umum, dan yang Anda lihat di sini, adalah "jumlah byte dalam file." Jika file tersebut adalah file teks kosong, mungkin memang berisi 0 byte. Angka ini penting bagi pemrogram karena kita sering perlu membuka file, "baca semua data," dan tutup. Kita perlu tahu berapa banyak byte data yang akan ada dalam file sehingga kita dapat merencanakan ke depan.

Makna lain muncul dari cara sebagian besar sistem file menyimpan data. Sebagian besar sistem file menyimpan data dalam blok. Sebagai contoh, sistem file dapat menyimpan data dalam blok 64kB, yang berarti tidak akan pernah mengalokasikan apa pun yang bukan kelipatan 64kB. Ini kedengarannya tidak efisien, tetapi itu bisa membuat pembukuan menjadi lebih sederhana, dan seringkali lebih sederhana berarti lebih cepat.

Arti ketiga, yang Anda tarik, adalah jumlah bit aktual yang diperlukan pada hard drive untuk menggambarkan keberadaan file. Ini termasuk informasi yang biasanya disimpan secara terpisah dari file. Sebagai contoh, di Linux, konsep "nama file" disimpan dalam inode untuk direktori yang berisi file (edit: dari komentar, secara teknis ini disimpan dalam data direktori. Ketika saya menulis ini, saya sedang memikirkan yang kecil case -directory. Data yang lebih kecil dari 156 byte dapat disimpan langsung di inode). Ini bukan makna yang umum digunakan, karena sangat sulit untuk menentukan tanpa mengetahui cara kerja sistem file Anda yang sangat dalam (apakah Anda memperhitungkan ruang yang diperlukan untuk menyimpan semua izin pada file?). Namun, jika Anda memiliki hard drive 1.000.000 byte,

Cort Ammon
sumber
2
"di inode untuk direktori yang berisi file" Bukankah maksud Anda data direktori, bukan inode? Inode berisi ukuran dan tanggal file, tetapi tidak ada nama ...
Medinoc
@Medinoc Poin bagus. Saya sedang memikirkan case inline ketika menyimpan data di dalam inode, tetapi saya tidak benar-benar memeriksa untuk melihat seberapa banyak ini bisa terjadi! Saya telah menambahkan hasil edit.
Cort Ammon
Terkait fitur data inline ext4, ini tidak berarti universal di semua sistem file. Selain itu, ini berlaku untuk file inode, bukan direktori. Mereka terpisah, direktori juga memiliki kemampuan data inline, tetapi mereka adalah fitur yang terpisah. File inode memiliki ukuran yang ditetapkan, setidaknya dalam kasus ext4, sehingga penggunaan data izin tidak relevan. Penggunaan disk file sangat tergantung pada filesystem yang digunakan, bagian ketiga dari jawaban ini hanya berlaku untuk ext4 sejauh yang saya tahu, ini tidak dijelaskan.
Phizes
8
Jika Anda memiliki hard drive 1.000.000 byte, mungkin sudah saatnya untuk mulai memikirkan peningkatan.
nekomatik
53

Nama file disimpan di tempat lain.

Disk Anda akan memiliki "sistem file" di dalamnya, sederhananya metode untuk memilih bagaimana nama file dan file diwakili dan ditafsirkan pada disk fisik.

Pada sebagian besar disk Windows Anda akan menggunakan sistem file yang disebut "NTFS" (Sistem File Teknologi Baru "), ini menyimpan informasi nama file dalam Master File Table (MFT) terpisah dari konten file. Lihat artikel Wikipedia di Master File Table .

Karena itu file itu sendiri akan berukuran 0 byte, tetapi entri dalam MFT masih akan menempati beberapa ruang.

Matthew1471
sumber
11
dan dalam kasus NTFS, ukuran file yang dilaporkan oleh Windows dan sebagian besar alat sebenarnya adalah ukuran aliran utama file, yang kami anggap sebagai konten file. File yang disimpan pada partisi NTFS juga dapat memiliki beberapa data yang disimpan dalam aliran data alternatif , dan masih memiliki ukuran 0 yang dilaporkan . Ini adalah fitur sistem file yang bagus untuk mengetahui apakah Anda ingin memiliki gambar lengkapnya :)
Paweł Bulwan
12

Ini pertanyaan ontologis yang cukup menarik ...

File itu sendiri adalah isi dari file tersebut. Jika file tidak memiliki konten, ia memiliki ukuran nol. Nama file adalah bagian dari file sebagaimana nama Anda sendiri secara fisik adalah bagian dari Anda (yaitu, tidak).

Sama seperti nama Anda ada sebagai ide di kepala orang (dan Anda sendiri) yang merujuk / menunjuk ke fisik Anda, nama file ada di pohon direktori sistem file dan merujuk / menunjuk ke file.

Luke
sumber
7

(Agak terlambat untuk jawabannya ...)

Bagaimana sebuah file menjadi ukuran nol sedikit lebih rumit daripada yang disediakan oleh jawaban di atas. Pertanyaan ini ditandai dengan Win7, tetapi melihat sistem file "sederhana" lainnya seperti FAT atau NTFS , mungkin berguna karena konsepnya sama.

Disk tidak "tahu" apa itu file dan apa itu direktori; itu semua data dalam blok kecil. OS membedakan antara arti dari blok data. Beberapa yang pertama khusus, tetapi sisa blok menyimpan informasi tentang data (misalnya: nama file, panjang file, blok data pertama yang menyimpan data), atau data itu sendiri.

Direktori adalah "file" khusus yang "data" -nya dimengerti oleh OS adalah blok informasi yang berisi informasi tentang file, bukan konten file. Analogi yang baik adalah perpustakaan fisik dan katalog kartu. Pikirkan blok informasi sebagai katalog kartu dan rak sebagai blok data (katalog kartu juga berada di struktur seperti rak).

Ketika Anda "membuat" file (katakan dengan touchperintah UNIX ), OS pertama-tama membuat entri di blok informasi (direktori), dengan yang berikut ini:

  • Name = My_File.txt
  • Panjang = 0
  • Memulai Blok Data = N / A
  • Info tambahan (pemilik, izin, tanggal dibuat / diperbarui / dimodifikasi), dll

Hanya jika ada beberapa data untuk "menulis", ia mencoba untuk menemukan blok data kosong untuk menyimpan data. Tetapi blok data datang dalam ukuran tetap (katakanlah 32K) nyaman untuk disk untuk sampai dan OS untuk membaca. Jika Anda hanya menulis "Halo", sebagian besar bloknya "kosong" (sebenarnya mungkin bukan nol, tetapi sampah dari apa yang ada di sana sebelumnya), jadi tabel tersebut juga memperbarui ukuran dengan panjang (misalnya 5 karakter + Akhir dari File) sehingga Anda tidak mendapatkan hal-hal buruk.

Ketika Anda memperbarui "file" ke panjang> ukuran blok, OS menulis data ke blok baru dan memperbarui blok data untuk mengatakan file berlanjut ke blok berikutnya SETELAH yang pertama (dan seterusnya) dan panjangnya diperbarui panjang baru (detail berbeda).

Yang akhirnya Anda dapatkan adalah kumpulan blok data informasi (direktori atau daftar) dengan informasi tentang rantai blok data (konten file).

Logikanya, ini juga menjelaskan mengapa suatu file bergerak pada sistem file yang sama berkedip cepat sementara salinannya memakan waktu lama. OS hanya perlu mengedit 2 blok direktori untuk menghapus entri dari satu direktori (blok data informasi) dan menambah yang lain. Hapus file: cukup hapus entri di blok direktori, membebaskan blok data file yang akan dialokasikan kembali.

ps: Hanya karena katalog kartu memiliki entri untuk sebuah buku tidak berarti itu ada di rak (mungkin sudah hilang atau hilang); ukuran file 0.

pps: Buku yang salah tempat di dalam perpustakaan menyiratkan perpustakaan pencarian, atau dalam istilah komputer: chkdsk atau disk perbaikan!

Pemahaman yang lebih besar dapat diperoleh dengan membaca tentang UNIX inode atau menghargai bagaimana sistem kontrol versi (ClearCase, TFS, Git, dll.) Mengelola tidak hanya file dan direktori, tetapi juga versi file dan bahkan versi direktori. Dalam kebanyakan kasus, semuanya disimpan dalam database dan disajikan kepada pengguna untuk tampil sebagai struktur dan file direktori klasik!

Ian W
sumber
4

Kami memiliki beberapa jawaban luar biasa di sini - saya hanya ingin menambahkan versi gambar (seribu kata dan semua itu.)

Seperti inilah tampilan hard drive berformat NTFS saya jika Anda memvisualisasikannya dengan alat defragmenting disk. The MFT (Master File Table) ditampilkan dalam violet:

masukkan deskripsi gambar di sini

Kotak kecil violet itu menggambarkan daftar file yang ada di HD saya. Secara kasar, untuk disk NTFS, apa Daftar Isi untuk buku; alih-alih halaman, ini menunjuk ke lokasi fisik mereka pada sisa disk 1 .

File dengan ukuran nol-byte dapat divisualisasikan sebagai entri Daftar Isi yang menunjukkan tidak ada halaman sama sekali:

masukkan deskripsi gambar di sini

Entri ada di sana, terdaftar - tetapi karena tidak ada halaman yang ditunjukkan, kita dapat mengasumsikan bahwa konten tersebut tidak ada.

1 - Tentunya, ini sedikit lebih rumit dari itu; tetapi poin seperti peta sektor, MFT cermin, dll. berada di luar cakupan pertanyaan ini.

OnoSendai
sumber
3

Filesystem menyimpan banyak informasi tentang file seperti nama file, ukuran file, waktu pembuatan, waktu akses, waktu modifikasi, pengguna yang dibuat, izin pengguna dan grup, fragmen, pointer ke cluster yang menyimpan file, tautan keras / lunak, atribut ... Itu disebut metadata file . Mengapa Anda menghitung metadata itu ke dalam ukuran file ketika pengguna tidak perlu peduli tentang mereka dan tidak tahu tentang mereka? Mereka hanya benar-benar peduli tentang konten file

Selain itu setiap sistem file menyimpan berbagai jenis metadata yang mengambil jumlah ruang yang berbeda pada disk. Misalnya izin POSIX sangat berbeda dari izin NTFS, dan ada juga inodeangka dalam POSIX yang tidak ada pada Windows. Bahkan sistem file POSIX sangat bervariasi, seperti ext3 dengan alamat blok 32-bit, ext4 dengan 48-bit, Btrfs dengan 64-bit dan ZFS dengan alamat 128-bit. Jadi bagaimana Anda akan menghitung metadata itu menjadi ukuran file?

Ambil contoh lain dengan file 100-byte yang metadata-nya menghabiskan 56 byte pada sistem file saat ini. Kami menyalin file ke sistem file lain dan sekarang dibutuhkan 128 byte metadata. Namun isi file persis sama , jumlah byte dalam file juga sama. Jadi menampilkan ukuran file sebagai 156 byte pada suatu sistem tetapi 228 byte pada yang lain sangat membingungkan dan kontra-intuitif .

phuclv
sumber
1

Ukuran file 0, mirip dengan mengatakan: Saya punya kertas dengan 5kata - kata di atasnya. Dan di kertas lain, ada 0kata-kata di atasnya. Jadi 0sepenuhnya mungkin.

Data meta file (waktu tanggal pembuatan, waktu tanggal modifikasi terakhir, pemilik file, izin), semuanya disimpan di tempat lain dan tidak dimasukkan sebagai bagian dari ukuran file.

nopole
sumber
0

Pahami secara sederhana ... ketika Anda membuat file .. ada entri direktori yang dihasilkan yang berfungsi sebagai penunjuk untuk lokasi memori file yang diidentifikasi oleh nama file yang Anda berikan. Ukuran direktori meningkat ketika Anda membuat lebih banyak dan lebih banyak pointer atau mengatakan file .. sedangkan ukuran file akan meningkat hanya jika Anda meletakkan data ssome di tempat yang ditunjuk yaitu di dalam file itu sendiri. Sampai kemudian ukurannya akan menjadi nol. :)

Vikash Mishra
sumber
Ini benar-benar komentar - bukan jawaban - dan hanya mengulangi apa yang dikatakan orang lain.
JakeGould
0

Jadi begini cara kerjanya:

Segera setelah Anda membuat file apa pun pada volume itu membuat catatan file dalam file mata NTFS yaitu $ MFT (tabel file Master). Karena ada FRS (segmen catatan File) hadir di MFT Anda akan melihat catatan. Setiap catatan file berukuran 1 KB secara default dalam kasus Sistem File NTFS. Tetapi ruang itu hanya diklaim jika Anda menyimpan beberapa informasi di dalam file. Meskipun Anda hanya menulis satu huruf "a" mengingat itu adalah file teks, itu akan mengklaim 1 KB ruang karena itu adalah ukuran standar FRS. Huruf "a" pergi ke aliran data default dan tidak bernama dari FRS, $ Data yang merupakan atribut di mana semua data Anda pergi jika Anda tidak memiliki ADS (Alternate Data Stream).

Beri tahu saya jika Anda memiliki pertanyaan.

Sdf
sumber