O inode muda quando renomear ou mover um arquivo?

5

no PHP, as funções fileinode() retornam o inode de um arquivo. Eu queria saber se eu posso usá-lo para determinar se um arquivo foi renomeado, movido ou modificado.

Eu fiz alguns testes e parece que o inode permanece o mesmo depois de renomear. Este comportamento é consistente? Funciona para qualquer tipo de arquivo, em qualquer distribuição linux?

    
por yoo 27.03.2015 / 02:56

4 respostas

6

Uma renomeação de arquivo que não cruze os limites do sistema de arquivos é apenas uma alteração de metadados, portanto, deve preservar o número do inode. De modo geral, abrir um arquivo e modificar seu conteúdo não deve alterar seu número de inode, o que só faz sentido dentro de um único sistema de arquivos de qualquer maneira (mas mudará os tempos de acesso, por exemplo). Observe que algumas ferramentas, como editores de texto, tendem a criar um novo arquivo em vez de escrever no lugar, e isso causaria o uso de um novo inode.

Se o seu objetivo for verificar se há alterações nos arquivos, verifique se os tempos de acesso e o tamanho podem ser mais confiáveis.

    
por 27.03.2015 / 03:16
3

Você não pode usar o inode para verificar se um arquivo foi alterado.

Pode ou não mudar quando um arquivo é renomeado ou movido. Ele normalmente permanecerá o mesmo, a menos que seja movido para outro disco ...

    
por 27.03.2015 / 09:36
0

A documentação do PHP sucks é muito ruim: vaga, ambígua e enganosa. fileinode() é definido como “recebe o arquivo inode” ou “retorna o inode”. Mas se você cavar um pouco mais, a documentação parece começar a dizer que esta função retorna o inode número . Um inode é mais que um número inode. A diferença entre “retornar o inode de um arquivo” e "pegar o inode número de um arquivo" é comparável a a diferença entre a minha assinatura da escritura da minha casa para você contra o meu dizendo meu endereço.

As respostas de dhag e robert são muito boas, então não vou repetir o que disseram ou tentar melhorar. Exceto para adicionar: a melhor maneira de detectar se um arquivo foi renomeado ou movido dentro de um sistema de arquivos é olhar para o membro st_ctime da estrutura do inode. Este é o horário (carimbo de data / hora do Unix: data e hora) da última alteração de c ao arquivo, incluindo seus atributos. De acordo com a documentação, você pode obter isso em PHP com int filectime ( string $filename ) .

    
por 27.03.2015 / 15:23
-1

Um inode costumava ser a estrutura em disco que continha permissões de acesso, propriedade, tamanho em bytes e os números de blocos de disco dos blocos de disco que continham os dados de um arquivo. Então, alguns metadados e alguns dados.

O nome do arquivo era apenas uma entrada em um arquivo especialmente marcado, chamado de "diretório". O nome foi associado ao "inode number".

Conceitualmente, todos os sistemas de arquivos locais ainda funcionam dessa maneira, embora os diretórios não sejam mais apenas arquivos com uma marca especial neles. Ainda há uma separação entre um trecho de metadados no disco (incluindo os blocos de dados do arquivo) e uma entrada de diretório. Os diretórios do ReiserFS são uma estrutura de dados em árvore em disco - não tenho certeza se há uma árvore B para cada diretório ou se há apenas um banco de dados como a estrutura com todos os diretórios nele.

Eu digo "sistemas de arquivos locais" porque os sistemas de arquivos de rede como o famoso NFS não precisam funcionar dessa maneira. Os appliances NetApp podem servir os mesmos dados com o NFS e com o CIFS, e a estrutura subjacente em disco não é um sistema de arquivos Unix, nem um sistema de arquivos NTFS ou FAT.

    
por 27.03.2015 / 03:42