Pergunta

Quais são as diferenças e em que casos um ou outro seria superior de alguma forma?

Foi útil?

Solução

Primeiro de tudo a função fopen pode ser usado apenas para operações portáteis simples com arquivos.

CreateFile Por outro lado, pode ser usado não apenas para operações com arquivos, mas também com diretórios (com o uso de opções correspondentes), tubos e vários dispositivos Windows.

CreateFile tem muitos interruptores úteis adicionais, como FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY e FILE_FLAG_SEQUENTIAL_SCAN, que pode ser muito útil em diferentes cenários.

Você pode usar CreateFile com um nome de arquivo mais que MAX_PATH personagens. Pode ser importante para alguns aplicativos de servidor ou que devem ser capazes de abrir algum arquivo (um scanner de vírus ou um aplicativo de backup, por exemplo). Isso é ativado usando a semântica do espaço para nome, embora esse modo tenha suas próprias preocupações, como a capacidade de realmente criar um arquivo nomeado ".." ou L"\xfeff\x20\xd9ab" (Boa sorte tentando excluí -los mais tarde).

Você pode usar CreateFile Em diferentes cenários de segurança. Quero dizer não apenas o uso de atributos de segurança. Se o processo atual tiver se_backup_name ou se_restore_name PrivilEge (como os administradores normalmente têm) e ativar esse privilégio, pode -se usar CreateFile abrir qualquer arquivo também um arquivo ao qual você não tem acesso através do descritor de segurança.

Se você quiser ler apenas o conteúdo de um arquivo, pode usar CreateFile, CreateFileMapping e MapViewOfFile Para criar mapeamento de arquivos. Em seguida, você pode trabalhar com um arquivo como com um bloco de memória, que pode aumentar a velocidade do seu aplicativo.

Também existem outros usos da função, que são descritos em detalhes em O artigo do MSDN correspondente.

Para que eu possa resumir: Somente se você tiver requisitos de portabilidade rígidos ou se precisar passar por um FILE* Para alguma biblioteca externa, então você tem que usar fopen. Em todos os outros casos, eu recomendaria que você use CreateFile. Para obter melhores resultados, eu também aconselho a aprender a API do Windows especificamente, pois existem muitos recursos para os quais você pode encontrar um bom uso.

ATUALIZADA: Não está diretamente relacionado à sua pergunta, mas também recomendo que você dê uma olhada em E/S transacional Funções que são suportadas começando com o Windows Vista. Usando esse recurso, você pode comprometer um monte de operação com arquivos, diretórios ou registro como uma transação que não pode ser interrompida. É uma ferramenta muito poderosa e interessante. Se você não estiver pronto agora para usar as funções de E/S transacionais, você pode começar com CreateFile e porgue sua inscrição para E/S transacional mais tarde.

Outras dicas

Isso realmente depende do tipo de programa que você está escrevendo. Se deveria ser portátil, fopen tornará sua vida mais fácil. fopen chamará CreateFile "Por trás das cenas".

Algumas opções mais avançadas (controle de cache, controle de acesso a arquivos etc.) estão disponíveis apenas se você estiver usando a API Win32 (eles dependem do identificador de arquivo Win32, em oposição ao FILE Ponteiro no stdio); portanto, se você estiver escrevendo um aplicativo Win32 puro, convém usar o createfile.

Createfile permite que você

  • Abra o arquivo para E/S assíncrona
  • Passe a otimização sugere como FILE_FLAG_SESTEAL_SCAN
  • Defina as configurações de segurança e herdamento sem problemas de encadeamento

Eles não retornam o mesmo tipo de alça, com o objeto FOPEN/FILE, você pode chamar outras funções de tempo de execução, como FPUPS (além de convertê -lo em um identificador de arquivo "nativo")

Sempre que possível, prefira invólucros de objetos que suportam RAII, como objetos de IO do arquivo fStream ou Boost.

Obviamente, você deve se preocupar com o modo de compartilhamento, para que o FOPEN () e o STL sejam insuficientes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top