Como um tamanho de arquivo pode ser zero?

173

Apenas algo que encontrei e não consegui pensar em uma explicação adequada. Se eu criar um arquivo * .txt vazio no meu PC e, em seguida, examinar seu tamanho, ele mostrará 0. Mas como isso é possível? Quero dizer, mesmo que o próprio arquivo esteja vazio, ele ainda deve ter algum tamanho, apenas para armazenar seu próprio nome. Como isso pode ser explicado? (Não específico do SO)

Eugene S
fonte
81
o nome do arquivo não conta no arquivo, é assim que pode ser explicado.
Njzk2 15/09/2015
123
Lembro-me de um amigo na faculdade que escreveu um software para armazenar texto como nomes de arquivos para contornar a cota de disco.
slebetman 17/09/2015
15
@ColeJohnson Eu era estagiário na década de 2000 em um dos laboratórios de informática da minha universidade, e a cota de usuários foi calculada como a soma do tamanho dos arquivos. Portanto, o armazenamento de dados como nomes de arquivos realmente se alteraria. Parreira, você pode salvar um programa em pastas e isso não conta na sua cota.
Mindwin 17/09/2015
20
@slebetman Este é o ponto em que a linha entre gênio e insanidade se torna turva.
Pharap
10
Uma técnica similar foi usado famosa num desafio de compressão ,
Oddthinking

Respostas:

202

É possível porque realmente não há arquivo. Há apenas uma entrada de diretório com nome e proprietário. A entrada do diretório é logicamente distinta do arquivo. Por exemplo, o mesmo arquivo pode ter mais de um nome em mais de um diretório.

Infelizmente, o termo "arquivo" nem sempre é usado para significar exatamente a mesma coisa. Mas a lógica do tamanho do arquivo vem do modelo em que uma entrada de diretório "anexa" um arquivo a um diretório e nomes de arquivos e metadados relacionados são armazenados no diretório.

David Schwartz
fonte
30
... também conhecido como Hard Links.
Daniel B
6
No diretório Caso contrário, se o mesmo arquivo estivesse em dois diretórios e você o renomeasse em um, isso modificaria o outro diretório, o que não faria nenhum sentido. Além disso, não fosse assim, qual seria o conteúdo de um diretório ?!
David Schwartz
14
Na maioria dos sistemas operacionais do tipo UNIX, como FreeBSD e Linux, você pode facilmente obter o tamanho de um diretório. Comandos como ls -ld <directory>irão funcionar.
David Schwartz
11
Não sei se isso é verdade para a versão atual do NTFS, mas as versões anteriores (por exemplo, no NT3.x) armazenariam os dados de arquivos muito pequenos na entrada do diretório. O arquivo literalmente não existiria.
John Rennie
13
Não é bem verdade que não há arquivo, a menos que o NTFS seja muito diferente de outros sistemas de arquivos. Em um sistema de arquivos Unix normal, haveria um inode armazenando as permissões, mod-times e assim por diante. A entrada do diretório ainda se refere a este inode. A única diferença entre um arquivo vazio e um arquivo não vazio é o ponteiro para alocar blocos. Um arquivo vazio possui o sistema de arquivos equivalente a um ponteiro NULL para seu mapa de blocos, no entanto, para indicar que não possui nenhum bloco de dados. As entradas do diretório não estão repletas de permissões e tempos de modificação, mesmo para arquivos vazios. por exemplo, os inodes XFS são 256B #
Peter Cordes
82

O significado semântico de "tamanho do arquivo" é diferente do que você está usando.

Existem muitos tamanhos de arquivo significativos. O mais comum, e o que você está vendo aqui, é "o número de bytes no arquivo". Se o arquivo for um arquivo de texto vazio, ele pode realmente conter 0 bytes. Esse número é importante para os programadores, porque geralmente precisamos abrir um arquivo, "ler todos os dados" e fechá-lo. Precisamos saber quantos bytes de dados estarão no arquivo para que possamos planejar com antecedência.

Outro significado surge da maneira como a maioria dos sistemas de arquivos armazena dados. A maioria dos sistemas de arquivos armazena dados em blocos. Por exemplo, o sistema de arquivos pode armazenar dados em blocos de 64 kB, o que significa que nunca alocará nada que não seja nem múltiplo de 64 kB. Isso parece ineficiente, mas pode tornar a contabilidade muito mais simples e, muitas vezes, mais simples significa mais rápido.

Um terceiro significado, no qual você está puxando, seria o número real de bits necessários no disco rígido para descrever a presença de um arquivo. Isso inclui informações que geralmente são armazenadas separadamente do arquivo. Por exemplo, no Linux, o conceito de "nome do arquivo" é armazenado no inode para o diretório que contém o arquivo (edit: from comments, tecnicamente isso é armazenado nos dados do diretório. Quando escrevi isso, estava pensando nas pequenas Dados menores que 156 bytes podem ser armazenados diretamente no inode). Esse não é um significado comumente usado, porque é terrivelmente difícil de determinar sem conhecer o funcionamento interno tremendamente profundo do seu sistema de arquivos (você considerou o espaço necessário para armazenar todas as permissões no arquivo?). No entanto, se você tiver um disco rígido de 1.000.000 bytes,

Cort Ammon
fonte
2
"no inode do diretório que contém o arquivo" Você não quis dizer os dados do diretório, e não o seu inode? O inode contém tamanhos de arquivo e datas, mas sem nomes ...
Medinoc
@Medinoc Bom ponto. Eu estava pensando no caso inline quando ele armazenava os dados no inode, mas na verdade não verifiquei o quanto isso poderia ocorrer! Eu adicionei uma edição.
Cort Ammon
Recurso de dados em linha relacionado do ext4, isso não é universal em todos os sistemas de arquivos. Além disso, isso se aplica ao inode de arquivos, não ao diretório. Eles são separados, os diretórios também têm um recurso de dados em linha, mas são recursos separados. Um inode de arquivos tem um tamanho definido, pelo menos no caso do ext4, portanto, o uso de permissões de dados é irrelevante. O uso de um disco de arquivos depende muito do sistema de arquivos em uso; a terceira parte desta resposta se aplica apenas ao ext4, tanto quanto eu sei, isso não está claro.
Phizes
8
Se você possui um disco rígido de 1.000.000 bytes, talvez seja hora de começar a pensar em uma atualização.
Nekomatic 17/09/2015
53

O nome do arquivo é armazenado em outro lugar.

Seu disco terá um "sistema de arquivos", coloque simplesmente um método para escolher como os nomes e os arquivos são representados e interpretados no disco físico.

Na maioria dos discos do Windows, você usará um sistema de arquivos chamado "NTFS" (New Technology File System "), que armazena informações sobre o nome do arquivo na Tabela de Arquivos Mestres (MFT) separada do conteúdo do arquivo.Veja o artigo da Wikipedia sobre Tabela de Arquivos Mestres .

O próprio arquivo, portanto, terá comprimento de 0 bytes, mas sua entrada na MFT ainda ocupará algum espaço.

Matthew1471
fonte
11
e no caso do NTFS, o tamanho do arquivo relatado pelo Windows e a maioria das ferramentas é na verdade o tamanho do fluxo principal do arquivo, que percebemos como o conteúdo do arquivo. O arquivo armazenado na partição NTFS também pode ter alguns dados armazenados em fluxos de dados alternativos e ainda ter o tamanho relatado de 0 . É um bom recurso sistema de arquivos para saber se você quer ter a imagem completa :)
Paweł Bulwan
12

Esta é uma questão ontológica bastante interessante ...

O arquivo em si é o conteúdo do arquivo. Se o arquivo não tiver conteúdo, ele será zero. O nome do arquivo faz parte do arquivo, assim como seu próprio nome fisicamente faz parte de você (ou seja, não é).

Assim como seu nome existe como uma ideia na cabeça das pessoas (e na sua) que se refere / aponta para você físico, o nome do arquivo existe na árvore de diretórios do sistema de arquivos e se refere / aponta para o arquivo.

Lucas
fonte
7

(Um pouco tarde para a resposta ...)

Como um arquivo pode ter o tamanho zero é um pouco mais complicado do que o fornecido pelas respostas acima. A pergunta está marcada como Win7, mas analisar outros sistemas de arquivos "mais simples", como FAT ou NTFS , pode ser útil, pois os conceitos são semelhantes.

O disco não "sabe" o que é um arquivo e o que é um diretório; são todos os dados em pequenos blocos. O SO distingue entre o significado dos blocos de dados. Os primeiros são especiais, mas o restante dos blocos contém informações sobre os dados (por exemplo: nome do arquivo, comprimento do arquivo, primeiro bloco de dados que contém os dados) ou os próprios dados.

Um diretório é um "arquivo" especial cujos "dados" o SO entende é um bloco de informações que contém informações sobre arquivos, não o conteúdo dos arquivos. Uma boa analogia é uma biblioteca física e o catálogo de cartões. Pense nos blocos de informações como o catálogo de cartões e nas prateleiras como os blocos de dados (o catálogo de cartões também fica em uma estrutura semelhante a uma prateleira).

Quando você "cria" um arquivo (digamos, com o touchcomando UNIX ), o SO primeiro cria uma entrada em um bloco de informações (diretório), com o seguinte:

  • Nome = Meu_Arquivo.txt
  • Comprimento = 0
  • Bloco de dados inicial = N / A
  • Informações adicionais (proprietário, permissões, data de criação / atualização / modificação), etc.

Somente se houver alguns dados para "gravar" ele tenta encontrar um bloco de dados vazio para armazenar os dados. Mas os blocos de dados vêm em tamanhos fixos (por exemplo, 32K), convenientes para o disco chegar e o sistema operacional ler. Se você escrever apenas "Olá", a maior parte do bloco estará "vazia" (na verdade, podem não ser zeros, mas lixo do que havia antes), então a tabela agora também atualiza o tamanho para o comprimento (digamos, 5 caracteres + Fim de File) para que você não receba as coisas ruins.

Quando você atualiza o "arquivo" para um tamanho> tamanho do bloco, o sistema operacional grava os dados no novo bloco e atualiza um bloco de dados para dizer que o arquivo continua no próximo bloco APÓS o primeiro (e assim por diante) e o comprimento é atualizado. novo comprimento (os detalhes diferem).

Você termina com uma coleção de blocos de dados de informações (diretórios ou listas) com informações sobre as cadeias de blocos de dados (conteúdo do arquivo).

Logicamente, isso também explica por que um arquivo movido no mesmo sistema de arquivos está piscando rapidamente enquanto uma cópia demora muito tempo. O sistema operacional precisa editar apenas dois blocos de diretório para remover a entrada de um diretório (bloco de dados de informações) e adicionar a outro. Excluir um arquivo: basta remover a entrada no bloco de diretório, liberando os blocos de dados do arquivo a serem realocados.

ps: Só porque o catálogo de cartões tem uma entrada para um livro não significa que ele está na prateleira (com check-out ou talvez perdido); tamanho do arquivo 0.

pps: um livro fora de lugar dentro da biblioteca implica biblioteca de pesquisa ou em termos de computador: chkdsk ou disco de reparo!

É possível obter um entendimento maior lendo sobre inodes UNIX ou apreciando como os sistemas de controle de versão (ClearCase, TFS, Git etc.) gerenciam não apenas arquivos e diretórios, mas também versões de arquivos e até versões de diretórios. Na maioria dos casos, tudo é armazenado em um banco de dados e apresentado ao usuário para aparecer como estrutura e arquivos clássicos de diretórios!

Ian W
fonte
4

Temos algumas excelentes respostas aqui - eu apenas adicionaria a versão gráfica (mil palavras e tudo isso).

É assim que um dos meus discos rígidos no formato NTFS se você o visualizar com uma ferramenta de desfragmentação de disco. A MFT (tabela mestre de arquivos) é mostrada em violeta:

insira a descrição da imagem aqui

Aquele pequeno quadrado violeta descreve a lista de arquivos presentes no meu HD. Em termos gerais, é para um disco NTFS o que o Índice é para um livro; em vez de páginas, ele aponta para o local físico no restante do disco 1 .

Um arquivo com tamanho de zero bytes pode ser visualizado como uma entrada do Índice que aponta para nenhuma página:

insira a descrição da imagem aqui

A entrada está lá, listada - mas como nenhuma página é indicada, podemos assumir que o conteúdo é inexistente.

1 - Certamente, é um pouco mais complicado que isso; mas pontos como mapas setoriais, MFTs espelhados etc. estão fora do escopo dessas perguntas.

OnoSendai
fonte
3

Os sistemas de arquivos armazenam muitas informações sobre um arquivo, como nome do arquivo, tamanho do arquivo, horário de criação, horário de acesso, horário de modificação, usuário criado, permissões de usuário e grupo, fragmentos, ponteiro para clusters que armazenam o arquivo, links físicos / físicos, atributos ... Esses são chamados de metadados de arquivo . Por que você conta esses metadados no tamanho do arquivo quando os usuários não precisam (precisam) se preocupar com eles e não sabem? Eles realmente se importam com o conteúdo do arquivo

Além disso, cada sistema de arquivos armazena diferentes tipos de metadados que ocupam diferentes quantidades de espaço no disco. Por exemplo, as permissões POSIX são muito diferentes das permissões NTFS e também existem inodenúmeros no POSIX que não existem no Windows. Até os sistemas de arquivos POSIX variam muito, como ext3 com endereço de bloco de 32 bits, ext4 com 48 bits, Btrfs com 64 bits e ZFS com endereço de 128 bits. Então, como você contará esses metadados no tamanho do arquivo?

Veja outro exemplo com um arquivo de 100 bytes cujos metadados consomem 56 bytes no sistema de arquivos atual. Copiamos o arquivo para outro sistema de arquivos e agora são necessários 128 bytes de metadados. No entanto, o conteúdo do arquivo é exatamente o mesmo , o número de bytes nos arquivos também é o mesmo. Portanto, exibir o tamanho do arquivo como 156 bytes em um sistema, mas 228 bytes em outro é muito confuso e contra-intuitivo .

phuclv
fonte
1

Um tamanho de arquivo 0é semelhante a dizer: Eu tenho um papel com 5palavras. E em outro artigo, tem 0palavras nele. Então, 0é inteiramente possível.

Os metadados do arquivo (data e hora da criação, data da última modificação, proprietário do arquivo, permissões) são todos armazenados em outro local e não incluídos como parte do tamanho do arquivo.

nopole
fonte
0

Entenda-o de uma maneira simples ... quando você cria um arquivo .. é gerada uma entrada de diretório que funciona como um ponteiro para o local da memória do arquivo identificado pelo nome do arquivo que você fornece. O tamanho do diretório aumenta à medida que você cria mais e mais ponteiros ou diz arquivos .. enquanto o tamanho do arquivo aumenta apenas se você colocar alguns dados no local apontado, ou seja, dentro do próprio arquivo. Até então, o tamanho será zero. :)

Vikash Mishra
fonte
Este é realmente um comentário - não uma resposta - e apenas repete o que os outros disseram.
JakeGould 23/09/15
0

Então é assim que funciona:

Assim que você cria qualquer arquivo em um volume, ele cria um registro no arquivo NTFS mata, ou seja, $ MFT (tabela de arquivos mestre). Como existe um FRS (segmento de registro de arquivo) presente na MFT, você verá um registro. Cada registro de arquivo tem tamanho de 1 KB por padrão no caso do NTFS FileSystem. Mas esse espaço só é reivindicado se você armazenar algumas informações dentro do arquivo. Mesmo que você apenas escreva uma única letra "a", considerando que é um arquivo de texto, ele exigirá 1 KB de espaço, porque esse é o tamanho padrão do FRS. A letra "a" vai para o fluxo de dados padrão e sem nome desse FRS, $ Data, que é um atributo para o qual todos os seus dados vão se você não tiver um ADS (Alternate Data Stream).

Deixe-me saber se você tiver alguma dúvida.

Sdf
fonte