nome do arquivo e nome do caminho de um arquivo

3

Diz-se que o nome do arquivo de um arquivo é um ponteiro apontando para o inode do arquivo. Antes de saber disso, achei que era o nome do caminho de um arquivo que faz esse trabalho.

Não tenho certeza de como um nome de caminho e um nome de arquivo estão definidos no Unix. Por exemplo, é correto que /home/tim/tim.pdf é o nome do caminho do arquivo com nome de arquivo tim.pdf .

Gostaria de saber qual a diferença entre o nome do arquivo e o nome do caminho de um arquivo? Obrigado.

    
por Tim 28.07.2014 / 03:53

3 respostas

1

Em terminologia POSIX , um nome_do_arquivo é o nome de uma entrada de diretório. Consiste em uma sequência não vazia de bytes diferente de / ou null. O termo “componente do nome do caminho” é sinônimo de “nome do arquivo”. Um nome de caminho é uma string que pode conter qualquer byte não nulo e que designa uma maneira para localizar um arquivo. Um nome de caminho consiste em uma série de nomes de arquivos, nos quais todos, exceto o último, se referem a um diretório. Resolução do nome do caminho é o processo de localizar um arquivo de um nome de caminho.

Por exemplo, /home/tim/tim.pdf é um nome de caminho. O último componente desse nome de caminho tim.pdf é um nome de arquivo; é o nome de uma entrada no diretório cujo nome de caminho é /home/tim . O nome do arquivo tim é o nome de uma entrada no diretório cujo nome de caminho é /home ; este arquivo é um diretório. tim.pdf também é um nome de caminho: qualquer nome de arquivo é um nome de caminho que por acaso tem um único componente e designa o arquivo com esse nome no diretório atual.

/ é um nome de caminho que se refere ao diretório raiz. . é um nome de arquivo que existe em todo diretório e refere-se ao próprio diretório. . é um nome de caminho que contém um único componente e se refere ao diretório atual.

Você pode pensar em um nome de arquivo como um ponteiro dentro de um diretório para um inode que é um arquivo nesse diretório. Um nome de caminho é uma especificação de onde encontrar um inode. Cada componente de um nome de caminho é um nome de arquivo que aponta para um inode no diretório atingido até o momento (se o arquivo existir). Os nomes de caminho iniciam no diretório raiz (se forem nomes absolutos de caminho , começando com / ) ou no diretório atual (se eles forem nomes de caminho relativos , não começando com / ).

Observe que, em muitos textos, a palavra “nome do arquivo” (ou “nome do arquivo”) é usada para indicar o que o POSIX chama um nome de caminho.

    
por 29.07.2014 / 03:00
6

Um diretório contém uma lista de nome de arquivo ⇒ mapeamentos inode. Seu diretório /home/tim inclui uma entrada com o nome de arquivo tim.pdf , apontando para (digamos) inode 1234 .

Como chegamos a esse diretório? Bem, um diretório é realmente um tipo especial de arquivo que contém essas entradas. Podemos encontrá-lo da mesma forma que encontramos outros arquivos, procurando em seu pai: /home terá uma entrada com o nome de arquivo tim que aponta para o inode do diretório. Por sua vez, podemos encontrar /home procurando em seu pai, / .

/ é a raiz e é um pouco mais especial. O sistema sabe como acessá-lo diretamente, porque não tem pai.

O nome de um arquivo é o nome local que ele possui em seu diretório: tim.pdf . O caminho de um arquivo descreve como você o obtém da raiz: /home/tim/tim.pdf . Se quiser, você pode pensar nisso como um conjunto de instruções: primeiro encontre / , depois encontre home dentro dele, depois tim e finalmente tim.pdf que você estava procurando.

Resolver qualquer caminho é, na verdade, um algoritmo recursivo com esse pseudocódigo:

inode find_file(inode where_i_am, string[] remaining_path):
    if remaining_path is empty:
         # Nothing more to look at - we've found the file!
         return where_i_am
    current_item = remaining_path[0]
    rest_of_path = remaining_path[1..]
    for entry in directory_entries(where_i_am):
        if entry.filename == current_item:
            return find_file(entry.inode, rest_of_path)
    return file not found

Nós encontraríamos seu arquivo com:

find_file(inode_of_root, ["home", "tim", "tim.pdf"])

Existem alguns casos em que as coisas ficam um pouco mais complicadas, o que o pseudocódigo não cobre. Uma delas é a montagem: quando você monta outra partição em, digamos, /home , o sistema lembra que quando vai para /home deve passar para essa outra partição e começar a procurar por tim na raiz de esse sistema de arquivos. O novo sistema de arquivos terá seu próprio conjunto de inodes, portanto, você realmente precisa conhecer o inode e o dispositivo para acessar os dados de um arquivo. Uma estrutura real, na verdade, inclui os dois.

Os links simbólicos informam ao sistema para procurar algum outro caminho nesse ponto e continuam pesquisando a partir desse novo local.

Outro caso é hard links (seu velho amigo). Um arquivo comum inode pode ter arbitrariamente muitos links para ele. Você poderia fazer um link com ln tim.pdf pdf.tim , que teria o mesmo conteúdo e viveria no mesmo ponto no disco. Haveria uma entrada de diretório separada pdf.tim que apontava para o mesmo inode 1234 como a entrada para tim.pdf . Nosso algoritmo funciona muito bem para este caso: um link físico para um arquivo é exatamente o mesmo que o arquivo original, e não precisamos distingui-lo de forma alguma. O fato de um link físico ser apenas outro nome para um inode é o motivo pelo qual você não pode criar links físicos em sistemas de arquivos.

Outra é as entradas especiais . e .. . Estas são (frequentemente, mas dependentes do sistema de arquivos) entradas de diretório reais. Eles são essencialmente hard links para o diretório em si e para seus pais. Nosso algoritmo lida com isso também. Há um caso interessante que surge com montagens: como o sistema de arquivos subjacente não sabe onde ele seria montado, ele não poderia ter a entrada .. correta. Para lidar com isso, o sistema essencialmente trava e mostra a entrada .. do diretório no dispositivo pai, em vez da raiz do sistema de arquivos montado.

Então, quando você está olhando para as coisas da perspectiva de inodes assim:

  • Um nome do arquivo é um nome em que um determinado inode é chamado dentro de um diretório específico.
  • Um caminho é algumas instruções sobre como alcançar um inode a partir de um ponto conhecido.
por 28.07.2014 / 04:33
0

Em geral, pathname e filenames são iguais. Primeiro, leia algumas regras para filenames da documentação do POSIX:

4.6 Filenames

For a filename to be portable across implementations conforming to IEEE Std 1003.1-2001, it shall consist only of the portable filename character set as defined in Portable Filename Character Set.

The hyphen character shall not be used as the first character of a portable filename. Uppercase and lowercase letters shall retain their unique identities between conforming implementations. In the case of a portable pathname, the slash character may also be used.

Você pode ver, nesta seção, que eles usam filename e pathname intercambiáveis.

Também há diferença entre eles no processo chamado Pathname Resolution :

4.11 Pathname Resolution

Pathname resolution is performed for a process to resolve a pathname to a particular file in a file hierarchy. There may be multiple pathnames that resolve to the same file.

Each filename in the pathname is located in the directory specified by its predecessor (for example, in the pathname fragment a/b, file b is located in directory a). Pathname resolution shall fail if this cannot be accomplished. If the pathname begins with a slash, the predecessor of the first filename in the pathname shall be taken to be the root directory of the process (such pathnames are referred to as "absolute pathnames"). If the pathname does not begin with a slash, the predecessor of the first filename of the pathname shall be taken to be the current working directory of the process (such pathnames are referred to as "relative pathnames").

pathname é resolvido para o arquivo, e o nome do arquivo está localizado no diretório especificado pelo seu antecessor.

Nota

por 28.07.2014 / 10:44