Como pode um tamanho de arquivo ser zero?

173

Apenas algo que eu encontrei e não consegui pensar em uma explicação adequada. Se eu criar um arquivo * .txt vazio no meu PC e depois olhar para o seu tamanho, ele mostrará 0. Mas como isso é possível? Quero dizer, mesmo que o arquivo em si 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 sistema operacional)

    
por Eugene S 15.09.2015 / 10:32

10 respostas

201

É possível porque realmente não há arquivo. Há apenas uma entrada de diretório com nome e proprietário. A entrada de 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 os nomes de arquivos e metadados relacionados são armazenados no diretório.

    
por 15.09.2015 / 10:34
82

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

Existem muitos tamanhos de arquivo que são 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 poderá conter 0 bytes. Esse número é importante para os programadores, pois 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 64kB, o que significa que ele nunca alocará nada que não seja um múltiplo par de 64kB. Isso parece ineficiente, mas pode tornar a contabilidade muito mais simples e, muitas vezes, mais simples significa mais rápido.

Um terceiro significado, que 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 normalmente são armazenadas separadamente do arquivo. Por exemplo, no Linux, o conceito de "filename" é armazenado no inode para o diretório que contém o arquivo (edit: a partir de comentários, tecnicamente isso é armazenado nos dados do diretório. Quando eu escrevi isso, eu estava pensando no pequeno -directory case. Dados menores que 156 bytes podem ser armazenados diretamente no inode). Este não é um significado comumente usado, porque é terrivelmente difícil de determinar sem saber o funcionamento interno tremendamente profundo do seu sistema de arquivos (você explicou 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 e quiser saber qual o tamanho de um arquivo que cabe nesse disco rígido, esse será um significado muito importante para você!

    
por 15.09.2015 / 19:41
53

O nome do arquivo é armazenado em outro lugar.

Seu disco terá um "sistema de arquivos", colocando simplesmente um método para escolher como os nomes e arquivos de arquivos serã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), isso armazena informações de nome de arquivo na tabela de arquivos mestre (MFT) separada do conteúdo do arquivo. Artigo da Wikipedia sobre a tabela de arquivos mestre .

O arquivo em si será, portanto, de comprimento 0 bytes, mas sua entrada na MFT ainda ocupará algum espaço.

    
por 15.09.2015 / 23:58
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 terá um tamanho zero. O nome do arquivo é tão parte do arquivo quanto o seu próprio nome é fisicamente uma parte de você (ou seja, não é).

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

    
por 16.09.2015 / 16:59
7

(Um pouco atrasado para a resposta ...)

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

O disco não "conhece" 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, tamanho do arquivo, primeiro bloco de dados contendo os dados) ou os dados em si.

Um diretório é um "arquivo" especial cujos "dados" o SO entende são um bloco de informações contendo 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 comando touch do UNIX), o SO primeiro cria uma entrada em um bloco de informações (diretório), com o seguinte:

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

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

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

O que você tem é uma coleção de blocos de dados de informação (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 uma movimentação de arquivo no mesmo sistema de arquivos está piscando rapidamente, enquanto uma cópia demora muito. O sistema operacional só precisa editar dois blocos de diretório para remover a entrada de um diretório (bloco de dados de informações) e adicioná-los 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 entrada para um livro não significa que ele esteja na prateleira (verificado ou perdido talvez); tamanho do arquivo 0.

pps: Um livro mal colocado dentro da biblioteca implica biblioteca de pesquisa, ou em termos de computador: chkdsk ou disco de reparo!

Uma compreensão maior pode ser obtida lendo-se inodes UNIX ou apreciando como 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é mesmo 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 de diretórios clássicos!

    
por 16.09.2015 / 11:55
4

Nós temos algumas excelentes respostas aqui - eu gostaria apenas de adicionar a versão da imagem (mil palavras e tudo mais).

Isto é o que um dos meus discos rígidos formatados em NTFS parece se você visualizá-lo com uma ferramenta de desfragmentação de disco. A MFT (Tabela de arquivos mestre) é mostrada em violeta:

EssepequenoquadradovioletadescrevealistadearquivospresentesnomeuHD.Emtermosgerais,é,paraumdiscoNTFS,oqueoÍndiceéparaumlivro;emvezdepáginas,apontaparasualocalizaçãofísicanorestododisco1.

UmarquivocomtamanhodebyteszeropodeservisualizadocomoumaentradadoÍndicequeapontaparanenhumapágina:

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

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

    
por 24.09.2015 / 02:05
3

loja Filesystems muito de informações sobre um arquivo, como nome do arquivo, tamanho do arquivo, tempo de criação, tempo de acesso, tempo modificado, criado pelo usuário, permissões de usuário e de grupo, fragmentos, ponteiro a clusters que armazenam o arquivo, links hard / soft, atributos ... Aqueles são chamados metadados do arquivo . Por que você conta esses metadados no tamanho do arquivo quando os usuários não precisam (deles) se preocupam com eles e não os conhecem? Eles só se importam com o conteúdo do arquivo

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 da permissão NTFS e também há inode números em POSIX que não existem no Windows. Mesmo 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?

Tome 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 .

    
por 16.09.2015 / 11:41
1

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

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

    
por 25.12.2016 / 05:37
0

Entenda-o de uma maneira simples ... quando você cria um arquivo ... existe uma entrada de diretório gerada 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 digita arquivos .. enquanto o tamanho do arquivo aumentará somente se você colocar alguns dados no local apontado, ou seja, dentro do próprio arquivo. Até então o tamanho será zero. :)

    
por 16.09.2015 / 20:55
0

Então é assim que funciona:

Assim que você cria um arquivo em um volume, ele cria um registro de arquivo no arquivo NTFS mata, ou seja, $ MFT (tabela de arquivos mestre). Como há um FRS (segmento de registro de arquivo) presente na MFT, você verá um registro. Cada registro de arquivo é de tamanho 1 KB por padrão no caso do NTFS FileSystem. Mas esse espaço só é reivindicado se você armazenar alguma informação dentro do arquivo. Mesmo que você acabou de escrever uma única letra "a", considerando que é um arquivo de texto, ele irá reivindicar 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 do FRS, $ Data, que é um atributo no qual todos os dados são enviados se você não tiver um ADS (Fluxo de Dados Alternativo).

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

por 23.09.2015 / 19:19