В Windows, я должен использовать CreateFile или Fopen, портирующую в сторону?

StackOverflow https://stackoverflow.com/questions/3038255

Вопрос

Каковы различия, и в каких случаях каким-то образом доказывалось один или другой?

Это было полезно?

Решение

Прежде всего функции fopen Может использоваться только для простых портативных операций с файлами.

CreateFile На другой стороне можно использовать не только для операций с файлами, но и с каталогом (с использованием соответствующих опций), трубами и различными устройствами Windows.

CreateFile имеет много дополнительных полезных коммутаторов, как FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY а также FILE_FLAG_SEQUENTIAL_SCAN, что может быть очень полезным в разных сценариях.

Вы можете использовать CreateFile с именем дольше, что MAX_PATH персонажи. Это может быть важно для некоторых серверов или тех, которые должны быть в состоянии открыть Любые файл (вирусный сканер или приложение резервного копирования). Это включено с помощью семантики имен SEMANTICS, хотя этот режим имеет свои проблемы, такие как способность фактически создавать файл с именем ".." или L"\xfeff\x20\xd9ab" (Удачи, пытаясь удалить их позже).

Вы можете использовать CreateFile в разных сценариях безопасности. Я имею в виду не только использование атрибутов безопасности. Если текущий процесс имеет SE_BACKUP_NAME или SE_RESTORE_NAME PRIVILEGE (как правило, есть как администраторы) и включить эту привилегию, можно использовать CreateFile открыть любой файл Также файл, на который у вас нет доступа через дескриптор безопасности.

Если вы хотите только прочитать содержимое файла, вы можете использовать CreateFile, CreateFileMapping а также MapViewOfFile создать отображение файлов. Затем вы можете работать с файлом, как с блоком памяти, что может увеличить скорость вашего приложения.

Есть также другие виды использования функции, которые подробно описаны в соответствующая статья MSDN.

Так что я могу суммировать: только если у вас есть трудные требования к портативности или если вам нужно пройти FILE* к какой-то внешней библиотеке, тогда вы должны использовать fopen. Отказ Во всех остальных случаях я бы порекомендовал вас использовать CreateFileОтказ Для достижения наилучших результатов я бы также советую изучать API Windows API, так как есть много функций, которые вы можете найти хорошее использование.

Обновленный: Не напрямую связан с вашим вопросом, но я также рекомендую взглянуть на транзакционный ввод Функции, которые поддерживаются, начиная с Windows Vista. Используя эту функцию, вы можете совершить кучу операции с файлами, каталогами или реестром в качестве одной транзакции, которая не может быть прервана. Это очень мощный и интересный инструмент. Если вы не готовы теперь использовать функции транзакции ввода / вывода, вы можете начать с CreateFile и портируйте свое приложение для транзакционного ввода / о.

Другие советы

Это действительно зависит от того, какой тип программы вы пишете. Если это должно быть портативным, fopen сделает вашу жизнь проще. fopen позвоню CreateFile "за кулисами".

Некоторые более продвинутые варианты (Cache Control, Control Access Control и т. Д.) доступны только в том случае, если вы используете API Win32 (они зависят от ручки файла Win32, в отличие от FILE Указатель в STDIO), поэтому, если вы пишете чистое приложение Win32, вы можете использовать CreateFile.

Createfile позволит вам

  • Открытый файл для асинхронного ввода / вывода
  • Пройти оптимизацию подсказки как file_flag_sexential_scan
  • Установите безопасность и наследующие настройки без проблем с резьбой

Они не возвращают один и тот же тип ручки, при этом объект FOPEN / FILE вы можете вызвать другие функции выполнения, такие как FPTES (а также преобразование его в «родной» дескриптор файлов)

По возможности, предпочитайте объектно-ориентированные обертки, которые поддерживают Raii, такие как FStream или Boost File Objects.

Вы должны, конечно, заботиться о режиме акций, поэтому Fopen () и STL недостаточно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top