Por que o robocopy ainda copia um arquivo aberto, aberto pelo editor txt no windows

4

Na wikipedia, é dito que o robocopy irá ignorar a cópia de arquivos em status aberto.

No entanto, quando está em teste para o comportamento de robocopy, o robocopy ainda copia o arquivo aberto pelo editor de texto mais simples do Windows. Por quê?

    
por cuda 24.09.2018 / 05:18

3 respostas

5

Primeiro, como @fejyesynb observou corretamente, o Bloco de Notas não mantém um identificador de arquivo ativo - ele abre o arquivo, lê (ou grava) rapidamente os dados e fecha o arquivo novamente. Os dados estão na tela, mas o arquivo está realmente fechado o tempo todo.

Em segundo lugar, o Windows herdou do MS-DOS o conceito de "modos de compartilhamento" como uma forma simples de bloqueio de arquivos. Ao abrir um arquivo, você pode escolher se deseja compartilhá-lo para leitura / gravação, somente leitura ou não.

Por exemplo, se seu programa (robocopy) quiser abrir o arquivo para leitura (FileAccess.Read), ele somente terá êxito se todas as alças de arquivo existentes permitirem o modo de compartilhamento 'ler' se não houver nenhum arquivo aberto manipulado). Mas se o arquivo foi aberto com "share none", você receberá "File in use" se tentar abri-lo para qualquer propósito.

Você pode fazer isso no PowerShell, chamando o .NET de nível baixo Função System.IO.File.Open () :

$fh = [System.IO.File]::Open($path,
                             [System.IO.FileMode]::Open,
                             [System.IO.FileAccess]::Read,
                             [System.IO.FileShare]::None)

O quarto parâmetro pode ser qualquer System.IO .FileShare enum value, por exemplo:

  • [System.IO.FileShare]::None - não compartilha nada
  • [System.IO.FileShare]::Read - compartilhar leitura (gravação / exclusão de bloco)
  • [System.IO.FileShare]::ReadWrite - compartilhar leitura / gravação (exclusão de bloco)

Quando terminar:

$fh.Close()
    
por 27.09.2018 / 06:47
4

Porque você está pensando em um significado diferente de "aberto".

O bloco de notas (e todos os outros editores de texto que eu conheço) abre um arquivo para leitura e você o vê na tela. Então fecha o arquivo enquanto você ainda pode ver o conteúdo (agora na RAM).

Se, por exemplo, você tiver fd = open("file.txt", FLAGS); e ainda não estiver fechado por close(fd) , ele não será copiado com o robocopy.

    
por 24.09.2018 / 05:24
1

Depende de como o arquivo é aberto

Muitos aplicativos carregam o arquivo inteiro na memória e o fecham, portanto, na verdade, o arquivo não está sendo usado. Obviamente, isso não pode ser usado com arquivos grandes, portanto, os editores de arquivos de texto grandes têm várias técnicas para funcionar de forma eficiente, como carregar uma parte do arquivo na memória de uma só vez

Muitos outros mantêm o identificador de arquivo aberto, mas eles não bloqueiam o arquivo

Bloco de notas OTOH mapeia o arquivo para a memória , resultando em um arquivo que não parece estar sendo aberto. Isso significa que o fejyesynb disse que não está correto, porque não carrega o arquivo na RAM

Para mais informações você pode ler

por 24.09.2018 / 11:38