Questão Como pode um tamanho de arquivo ser zero?


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 SO)


173


origem


o nome do arquivo não conta no arquivo, como isso pode ser explicado. - njzk2
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
@ColeJohnson Eu era estagiário nos anos 2000 em um dos laboratórios de informática do meu U, e a cota do usuário era calculada como a soma dos arquivos. Então, armazenar dados como nomes de arquivos, de fato, contornaria o qouta. Heck você poderia salvar um programa em pastas e isso não contaria contra sua cota. - Mindwin
@slebetman Esse é o ponto em que a linha entre o gênio e a insanidade se torna indistinta. - Pharap
Uma técnica similar foi famosa usada em um desafio de compressão, - Oddthinking


Respostas:


É possível porque realmente não existe 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.


201



... também conhecido como Hard Links. - Daniel B
No diretório. Caso contrário, se o mesmo arquivo estivesse em dois diretórios e você o renomeísse em um, isso modificaria o outro diretório, o que não faria sentido algum. Além disso, se não fosse assim, qual seria o conteúdo de um diretório ?! - David Schwartz
Na maioria dos sistemas operacionais UNIX, como FreeBSD e Linux, você pode facilmente obter o tamanho de um diretório. Comandos como ls -ld <directory> vai funcionar. - David Schwartz
Não sei se isso é verdade para a versão atual do NTFS, mas versões anteriores (por exemplo, no NT3.x) armazenariam os dados para arquivos muito pequenos na entrada de diretório. O arquivo literalmente não existiria. - John Rennie
Não é bem verdade que não exista nenhum 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 de 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 os blocos. Um arquivo vazio tem o equivalente do sistema de arquivos de um ponteiro NULL para o seu mapa de bloco, no entanto, para indicar que ele não possui nenhum bloco de dados. Entradas de diretório não estão cheias de permissões e tempos de modificação, mesmo para arquivos vazios. Por exemplo, os inodes XFS são 256B - Peter Cordes


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

Existem muitos tamanhos de arquivos 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 geralmente 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ê!


82



"no inode para o diretório que contém o arquivo" Você não quer dizer os dados do diretório, em vez de seu inode? O inode contém tamanhos e datas de arquivos, mas nenhum nome ... - Medinoc
@Medinoc Bom ponto. Eu estava pensando no caso inline quando ele armazenava os dados dentro do inode, mas na verdade não chequei para ver o quanto isso poderia acontecer! Eu adicionei uma edição. - Cort Ammon
Relacionado recurso de dados embutidos de ext4, isso não é universal em todos os sistemas de arquivos. Além disso, isso se aplica aos arquivos inode, não ao diretório. Eles são diretórios separados, também têm um recurso de dados in-line, mas eles são recursos separados. Um arquivo inode tem um tamanho de conjunto, pelo menos no caso do ext4, portanto o uso de dados de permissões é irrelevante. Um uso de disco de arquivos é altamente dependente do sistema de arquivos em uso, a terceira parte desta resposta só se aplica ao ext4, tanto quanto eu posso dizer, isso não está claro. - Phizes
Se você tiver um disco rígido de 1.000.000 bytes, talvez seja hora de começar a pensar em uma atualização. - nekomatic


O nome do arquivo é armazenado em outro local.

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

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


53



e no caso do NTFS, o tamanho do arquivo relatado pelo Windows e pela maioria das ferramentas é, na verdade, o tamanho do arquivo. convencional do arquivo, que percebemos como o conteúdo do arquivo. O arquivo armazenado na partição NTFS também pode ter alguns dados armazenados fluxos de dados alternativos, e ainda tem o tamanho relatado de 0. É um bom recurso de sistema de arquivos para saber se você quer ter uma visão completa :) - Paweł Bulwan


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 o seu nome existe como uma ideia na cabeça das pessoas (e na sua) que se refere / aponta para o físico, o nome do arquivo existe na árvore de diretórios do sistema de arquivos e se refere / aponta para o arquivo.


12





(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 GORDO ou NTFS, pode ser útil, pois 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 UNIX touch comando), o sistema operacional primeiro cria uma entrada em um bloco de informações (diretório), com o seguinte:

  • Name = My_File.txt
  • Comprimento = 0
  • Iniciando o bloco de dados = N / A
  • Informações adicionais (proprietário, permissões, criado / atualizado / data modificada), 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 comprimento> 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 novo comprimento (detalhes diferem).

O que você obtém é 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 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!

Um entendimento maior pode ser obtido lendo-se 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 de diretórios clássicos!


7





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

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. o MFT (tabela de arquivos mestre) é mostrado em violeta:

enter image description here

Esse 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, aponta para sua localização física no resto do disco1.

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

enter image description here

A entrada está lá, listada - mas como nenhuma página é indicada, podemos supor 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 questões.


4





Armazenamento de sistemas de arquivos muito de informações sobre um arquivo como nome do arquivo, tamanho do arquivo, tempo de criação, tempo de acesso, horário modificado, usuário criado, permissões de usuário e grupo, fragmentos, ponteiro para clusters que armazenam o arquivo, links físicos / suaves, 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

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 da permissão NTFS, e há também 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 são os mesmos. Então, exibindo o tamanho do arquivo como 156 bytes em um sistema, mas 228 bytes em outro é muito confuso e contra-intuitivo.


3





Um tamanho de arquivo de 0, é semelhante a dizer: eu tenho um papel com 5 palavras sobre ele. E em outro papel, tem 0 palavras sobre ele. assim 0 é inteiramente possível.

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


1





Entenda isso de uma maneira simples ... quando você cria um arquivo ... existe uma entrada de diretório gerada que funciona como um ponteiro para a localização 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. :)


0



Este é realmente um comentário - não uma resposta - e apenas repete o que os outros disseram. - JakeGould


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.


0