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)
filesystems
Eugene S
fonte
fonte
Respostas:
É 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.
fonte
ls -ld <directory>
irão funcionar.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,
fonte
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.
fonte
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.
fonte
(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
touch
comando UNIX ), o SO primeiro cria uma entrada em um bloco de informações (diretório), com o seguinte: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!
fonte
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:
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:
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.
fonte
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
inode
nú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 .
fonte
Um tamanho de arquivo
0
é semelhante a dizer: Eu tenho um papel com5
palavras. E em outro artigo, tem0
palavras 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.
fonte
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. :)
fonte
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.
fonte