FSCTL_RECALL_FILE IOCTL (winioctl.h)
Recupera um arquivo da mídia de armazenamento gerenciado pelo Armazenamento Remoto, que é o software de gerenciamento de armazenamento hierárquico.
Para recuperar um arquivo, chame a função DeviceIoControl com os parâmetros a seguir.
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to file or directory
FSCTL_RECALL_FILE, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
NULL, // lpOutBuffer
0, // nOutBufferSize
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
Comentários
FSCTL_RECALL_FILE recupera um arquivo do armazenamento, por exemplo, uma fita gerenciada pelo Armazenamento Remoto. Se o arquivo já estiver armazenado em cache localmente, essa operação não fará nada. Da mesma forma, se o arquivo não tiver sido movido para o armazenamento remoto, essa operação não fará nada.
FSCTL_RECALL_FILE opera somente em sistemas em que o Armazenamento Remoto está instalado. Se o Armazenamento Remoto não estiver instalado, a operação falhará e GetLastError retornará o código de erro ERROR_INVALID_FUNCTION.
Os diretórios não podem ser movidos para o armazenamento remoto. A chamada FSCTL_RECALL_FILE para um diretório falha e GetLastError retorna o código de erro ERROR_INVALID_HANDLE.
Normalmente, os arquivos armazenados em mídia gerenciada pelo Armazenamento Remoto são recuperados quando um aplicativo tenta fazer o primeiro acesso aos dados. Um aplicativo que abre um arquivo sem acessar imediatamente os dados pode acelerar o primeiro acesso usando FSCTL_RECALL_FILE imediatamente após abrir o arquivo. No entanto, evite o recall indiscriminado de arquivos que um aplicativo não toque.
Antes de chamar FSCTL_RECALL_FILE não é necessário testar os atributos de um arquivo para o sinalizador FILE_ATTRIBUTE_OFFLINE com a função GetFileAttributes. O teste é desnecessário porque um arquivo online não é afetado por essa operação. No entanto, qualquer chamada do sistema operacional leva tempo do processador. Para conservar o tempo do processador, chame GetFileAttributes para marcar atributos de arquivo para determinar se FSCTL_RECALL_FILE é necessário.
Para obter as implicações de E/S sobreposta nesta operação, consulte a seção Comentários do tópico DeviceIoControl .
Em Windows 8 e Windows Server 2012, esse código é compatível com as tecnologias a seguir.
Tecnologia | Com suporte |
---|---|
Protocolo SMB (SMB) 3.0 | No |
TFO (Failover transparente) do SMB 3.0 | No |
SMB 3.0 com compartilhamentos de arquivos de expansão (SO) | No |
Sistema de arquivos de Volume Compartilhado Clusterizado (CsvFS) | No |
ReFS (Sistema de Arquivos Resiliente) | Sim |
Exemplos
O exemplo de código a seguir é um utilitário de linha de comando que lembra um ou mais arquivos indicados na linha de comando do armazenamento remoto.
#include <Windows.h>
#include <malloc.h>
#include <stdio.h>
#include <WinIoCtl.h>
DWORD RecallFile(PTCHAR FileName);
int _cdecl _tmain(int argc, TCHAR *argv[])
{
LONG i;
if (argc < 2) {
printf("Usage: recall <file-name1> <file-name2> ...\n");
return 1;
}
for (i = 1; i < argc; i++) {
(void) RecallFile((PTCHAR) argv[i]);
}
return 0;
}
DWORD RecallFile(IN PTCHAR FileName)
/*++
Routine Description
Recalls the file with the supplied path.
Arguments
FileName - Path of the file to be recalled
Return Value
0 - Recall is successful.
Any other value - Error code for the operation.
--*/
{
HANDLE fileHandle;
DWORD nbytes;
DWORD errorCode = 0;
fileHandle = CreateFile((LPCTSTR) FileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (fileHandle == INVALID_HANDLE_VALUE)
{
errorCode = GetLastError();
printf("Couldn't open file %s: error %x\n", FileName,
errorCode);
return errorCode;
}
if (!DeviceIoControl(fileHandle,
FSCTL_RECALL_FILE,
NULL,
0,
NULL,
0,
&nbytes,
NULL))
{
errorCode = GetLastError();
printf("Couldn't recall file %s: error %x\n",
FileName, errorCode);
}
CloseHandle(fileHandle);
return errorCode;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Cabeçalho | winioctl.h (inclua Windows.h) |