TL; DR
Arquivos que existem no sistema de arquivos local podem ser vistos por um aplicativo virtualizado quando a pasta VFS correspondente está no modo "mesclar" ou a pasta correspondente não é mencionada no VFS. Mas, os mesmos arquivos não podem ser vistos quando a pasta VFS correspondente está no modo "override".
Um aplicativo virtualizado só grava no sistema de arquivos local quando as duas coisas a seguir forem verdadeiras:
- a pasta em que o arquivo está escrito não é mencionada no VFS e
- a pasta em que o arquivo está escrito existe no sistema de arquivos local
Não consegui encontrar documentação autoritativa para responder a esta pergunta. A informação mais próxima que encontrei foi
Teste empírico
Minha experimentação bruta acabou resultando em resultados confusos, então decidi executar alguns testes mais formais para entender o resultado.
Configuração
O teste envolveu a criação de arquivos em cada um dos seguintes estágios:
- A: Antes de sequenciar
- B: durante o sequenciamento de dentro do seqüenciador
- C: antes de publicar
- D: Após a publicação de um processo virtual dentro do aplicativo
Existem três casos possíveis de como o VFS se aplica a uma pasta no final do seqüenciamento:
- modo de substituição
- modo de mesclagem
- não mencionado
No estágio de publicação, qualquer pasta pode ser criada ou não em cada um dos sistemas de arquivos locais e virtuais. São quatro possibilidades.
As três formas em que o VFS se aplica, combinadas com as quatro possibilidades de publicação, resultam em 12 casos que testei. Eu usei alguns scripts para automatizar isso e (espero) evitar erros. Esses scripts estão no final deste post.
Resultados
O VFS, conforme visto na interface do usuário do seqüenciador, é o seguinte:
Euverifiqueiaexistênciadecadaumdosarquivosescritospelosscriptsdedentroedeforadabolhadoaplicativopublicado.Osresultadosestãonestatabela:
Análise
Combasenatabela,parecequeasseguintesafirmaçõessãoválidas:
- Todososarquivoscriadospeloaplicativovirtualizadoemexecuçãopodemservistosporesseaplicativo.Issonãoésurpresa,poisissoéabsolutamentenecessárioparaoaplicativofuncionar.
- ArquivosqueexistemnosistemadearquivoslocalnãopodemservistosporumaplicativovirtualizadoquandoapastaVFScorrespondenteestánomodo"substituir".
- Arquivos que existem no sistema de arquivos local podem ser vistos por um aplicativo virtualizado quando a pasta VFS correspondente está no modo "mesclar" ou a pasta correspondente não é mencionada no VFS.
- O único caso em que um aplicativo virtualizado grava no sistema de arquivos local ocorre quando os dois itens a seguir são verdadeiros:
- a pasta em que o arquivo está escrito não é mencionada no VFS e
- a pasta em que o arquivo está escrito existe no sistema de arquivos local
Scripts
A-before-sequencing.ps1
$splat = @{
Cases = 4..11
FolderName = 'ExistsBeforeSequencing'
FileName = 'ExistsBeforeSequencing'
Mode = 'Create'
}
.\Alter-Folders.ps1 @splat
B durante o sequenciamento.ps1
$splats = @(
@{
Cases = 0..3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedDuringSequencing'
Mode = 'Create'
},
@{
Cases = 4..7
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedDuringSequencing'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
C antes da publicação.ps1
$splats = @(
@{
Cases = 0..3
FolderName = 'CreatedDuringSequencing'
Mode = 'Remove'
}
@{
Cases = 4..11
FolderName = 'ExistsBeforeSequencing'
Mode = 'Remove'
}
@{
Cases = 1,3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedBeforePublishing'
Mode = 'Create'
}
@{
Cases = 5,7,9,11
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedBeforePublishing'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
D-app-running.ps1
$splats = @(
@{
Cases = 2,3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedByRunningApp'
Mode = 'Create'
}
@{
Cases = 6,7,10,11
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedByRunningApp'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
Alter-Folders.ps1
[CmdletBinding()]
param
(
[parameter(Mandatory=$true)]
[int32[]]
$cases,
[parameter(Mandatory=$true)]
[string]
$FolderName,
[string]
$FileName,
[parameter(Mandatory=$true)]
[string]
[ValidateSet('create','remove')]
$mode
)
$path = $env:ProgramData
if ( 'create' -eq $mode )
{
$cases |
% {
New-Item "$path\$FolderName$_" -ItemType Directory | Out-Null
New-Item "$path\$FolderName$_\$FolderName$_-1" -ItemType Directory | Out-Null
$filePath = "$path\$FolderName$_\$FolderName$_-1\$FileName$_-1.txt"
$filePath | Out-File $filePath
}
}
if ( 'remove' -eq $mode )
{
$cases |
% {
Remove-Item "$path\$FolderName$_" -Recurse -Force
}
}