процедуры обработки файлов в Windows - PullRequest
1 голос
/ 07 июля 2010

Разрешено ли смешивать различные функции обработки файлов в одной системе, например,

  • fopen () из cstdio
  • open () из fstream
  • CreateFile fromWin API?

У меня большое приложение с большим количеством устаревшего кода, и кажется, что все три метода используются в этом коде.Каковы потенциальные риски и побочные эффекты?

Ответы [ 3 ]

2 голосов
/ 07 июля 2010

Да, вы можете смешать все это вместе.В любом случае все сводится к вызову CreateFile.

Конечно, вы не можете передать указатель файла на CloseHandle и ожидать, что он будет работать, а также не ожидать, что дескриптор будет открыт с CreateFileработать с fclose.

Думайте об этом точно так же, как вы думаете о malloc / free против new / delete в C ++.Совершенно нормально использовать одновременно, если вы не смешиваете их.

1 голос
/ 07 июля 2010

Ваша ситуация не так уж редка.

Код, предназначенный для переносимости, обычно пишется с использованием стандартных процедур доступа к файлам (fopen, open и т. Д.).Код, специфичный для ОС, обычно пишется с использованием собственного API этой ОС.Ваше большое приложение, скорее всего, представляет собой комбинацию этих двух типов кода.У вас не должно возникнуть проблем при смешивании стилей доступа к файлам в одной и той же программе, если вы помните, что они должны быть прямыми (они не являются взаимозаменяемыми).

Самый большой риск, связанный с этим, - это, вероятно, переносимость.Если у вас есть унаследованный код, который существует уже некоторое время, он, вероятно, использует стандартные методы доступа к файлам C / C ++, особенно если он предшествует Win32 API.Использование Win32 API приемлемо, но вы должны понимать, что привязываете свой код к области действия и времени жизни этого API.Вам придется проделать дополнительную работу для переноса этого кода на другую платформу.Вам также придется переделать этот код, если, скажем, в будущем Microsoft устареет Win32 API в пользу чего-то нового.Стандартные методы C / C ++ всегда будут там, постоянными и неизменными.Если вы хотите помочь вашему коду в будущем, придерживайтесь как можно больше стандартных методов и функций.В то же время есть некоторые вещи, которые требуют Win32 API и не могут быть выполнены с использованием стандартных функций.

Если вы работаете с сочетанием стилей C, C ++ и Win32код, тогда я бы предложил разделить (насколько это возможно) ваш специфичный для ОС код и ваш переносимый код на отдельные модули с четко определенными API.Если в будущем вам придется переписывать код Win32, это может упростить задачу.

1 голос
/ 07 июля 2010

Совершенно нормально использовать все эти файловые методы, если им не нужно взаимодействовать. В ту минуту, когда вам нужно передать файл, открытый одним методом, в функцию, которая предполагает другой метод, вы обнаружите, что они несовместимы.

В качестве стиля я бы порекомендовал выбрать один и придерживаться его, но если код получен из нескольких источников, это может оказаться невозможным. Было бы большим усилием рефакторинга изменить существующий код без особой выгоды.

...