Implementação do sistema de arquivos IPropertySetStorage-NTFS
O NTFS versão 5.0 fornece uma implementação de IPropertySetStorage para arquivos em um volume NTFS quando os próprios arquivos não são arquivos compostos. A implementação do NTFS é equivalente à implementação de arquivo composto. Para obter mais informações sobre exceções, consulte Comentários.
Para obter um ponteiro para a implementação NTFS de IPropertySetStorage
- Chame StgCreateStorageEx e especifique STGFMT_FILE no parâmetro grfFlags para criar um novo arquivo.
- Chame StgOpenStorageEx e especifique o valor de enumeração STGFMT_FILE ou STGFMT_ANY no parâmetro grfFlags para abrir um arquivo existente.
No entanto, você não pode obter a implementação NTFS de IPropertySetStorage para um arquivo composto. Ao abrir um arquivo composto com StgOpenStorage, especificar o valor de enumeração STGFMT_FILE resulta em um erro.
Além disso, conjuntos de propriedades simples não podem ser transacionados. Ou seja, você não pode especificar STGM_TRANSACTED no parâmetro grfmode dos métodos Create e Open , a menos que você também especifique PROPSETFLAG_NONSIMPLE no parâmetro grfFlags . O próprio objeto de armazenamento do conjunto de propriedades não dá suporte ao processamento de transações.
Quando usar
Chame os métodos IPropertySetStorage para criar, abrir ou excluir conjuntos de propriedades no armazenamento atual do conjunto de propriedades NTFS. Também há um método, IPropertySetStorage::Enum, que fornece um ponteiro para um enumerador que pode ser usado para enumerar os conjuntos de propriedades no armazenamento.
Compatibilidade
As implementações NTFS de IPropertySetStorage e IPropertyStorage estão disponíveis a partir do Windows 2000. Versões anteriores não podem acessar esses conjuntos de propriedades.
A implementação do NTFS armazena conjuntos de propriedades em fluxos alternativos de um arquivo NTFS. Os fluxos alternativos devem ser copiados quando o arquivo main é copiado.
Cuidado
Nem todos os sistemas de arquivos dão suporte a esses fluxos. Se um arquivo NTFS com conjuntos de propriedades for copiado para um volume FAT, somente os dados no arquivo serão copiados; o conjunto de propriedades é perdido. A função CopyFile não retorna um erro nesse caso.
Cuidado
Se o computador que executa a cópia de arquivo não for um computador em execução no Windows 2000 ou posterior, os conjuntos de propriedades poderão ser perdidos. Por exemplo, se um computador em execução no sistema operacional Windows 95 copiar um arquivo NTFS, o conjunto de propriedades será perdido mesmo que o arquivo de destino também esteja em um volume NTFS.
Métodos
A implementação do sistema de arquivos NTFS de IPropertySetStorage dá suporte aos métodos a seguir.
-
Cria um novo conjunto de propriedades no armazenamento de arquivos NTFS atual e, no retorno, fornece um ponteiro de interface para a implementação do arquivo NTFS IPropertyStorage . O modo de compartilhamento especificado no parâmetro grfmode deve ser STGM_SHARE_EXCLUSIVE.
-
Abre um conjunto de propriedades existente no armazenamento de propriedades atual. No retorno, ele fornece um ponteiro de interface para a implementação de arquivo NTFS de IPropertyStorage. O modo de compartilhamento especificado no parâmetro grfmode deve ser STGM_SHARE_EXCLUSIVE.
-
Exclui um conjunto de propriedades no armazenamento de propriedades atual.
-
Cria um objeto usado para enumerar estruturas STATPROPSETSTG . Cada estrutura STATPROPSETSTG fornece dados sobre um único conjunto de propriedades.
Comentários
As implementações NTFS de IPropertySetStorage e IPropertyStorage armazenam conjuntos de propriedades em um arquivo sem afetar o conteúdo desse arquivo. Por exemplo, se você criar um conjunto de propriedades em um arquivo HTML chamado Default.htm, esse arquivo ainda será exibido corretamente em um navegador da Web. Ou seja, as alterações em um arquivo usando essas duas interfaces são indetectáveis ao acessar um arquivo com a função CreateFile .
A implementação NTFS de IPropertySetStorage fornece uma implementação segura quando usada para gravar conjuntos de propriedades em um arquivo em um volume NTFS versão 5.0. Esses conjuntos de propriedades não podem ser corrompidos pela implementação, mesmo em caso de falha do sistema. Por exemplo, se a energia de um sistema falhar durante uma chamada para IPropertyStorage::Commit enquanto o conjunto de propriedades for liberado para o disco, o conjunto de propriedades nunca será deixado em um estado intermediário. A versão anterior do conjunto de propriedades permanece ou todas as atualizações são salvas.
A implementação de NTFS de IPropertySetStorage difere da implementação de arquivo composto das seguintes maneiras:
Uma estrutura STATPROPSETSTG obtida da interface IEnumSTATPROPSETSTG contém um membro clsid cujo valor é sempre zero (CLSID_NULL). Com a implementação do arquivo composto, o membro clsid correto é retornado para conjuntos de propriedades não simples (consulte Storage e Stream Objects for a Property Set).
Ao obter uma implementação NTFS do ponteiro da interface IPropertySetStorage usando a função StgCreateStorageEx ou StgOpenStorageEx , o parâmetro grfmode deve seguir as mesmas regras da implementação de arquivo composto.
Além disso, os seguintes sinalizadores podem não ser usados:
STGM_SIMPLE, STGM_TRANSACTED, STGM_CONVERT, STGM_PRIORITY e STGM_DELETEONRELEASE.
Quando uma interface NTFS IPropertySetStorage é obtida pelas funções StgCreateStorageEx ou StgOpenStorageEx , os modos de compartilhamento se aplicam principalmente a outras instâncias dessa interface e não a instâncias de abertura do próprio arquivo. Por exemplo, se uma interface IPropertySetStorage do NTFS for aberta chamando a função StgOpenStorageEx , com o parâmetro grfmode definido como STGM_READWRITE| STGM_SHARE_EXCLUSIVE, é possível abrir o arquivo com a função CreateFile .
Essas instâncias simultâneas de abertura dessa interface estão sujeitas às seguintes restrições: o parâmetro dwShareMode na função CreateFile deve especificar o sinalizador FILE_SHARE_READ e o parâmetro dwAccess não deve especificar o sinalizador DELETE . Além disso, as funções DeleteFile e MoveFile não devem ser chamadas em um arquivo para o qual essas interfaces do conjunto de propriedades estão abertas, pois essas funções exigem acesso DELETE ao arquivo.
Se um método NTFS IPropertySetStorage for aberto como somente leitura e o arquivo não tiver conjuntos de propriedades no momento, o objeto retornado não manterá o arquivo aberto. Consequentemente, outras aberturas desse arquivo serão bem-sucedidas, mesmo que o modo de compartilhamento da operação aberta original o rejeite de outra forma.
Exemplo; se um NTFS IPropertySetStorage for aberto no modo STGM_READ| STGM_SHARE_EXCLUSIVE, e o arquivo não tiver conjuntos de propriedades, será possível abrir simultaneamente o arquivo STGM_READWRITE| STGM_SHARE_EXCLUSIVE.
Tópicos relacionados