Проверка возможности открытия файла с помощью переносного C - PullRequest
2 голосов
/ 16 марта 2009

Я хотел бы выполнить быструю проверку, можно ли открыть файл. Он должен быть написан на переносимом C или, по крайней мере, для работы на системах Win32 и POSIX. #ifdefs являются приемлемыми.

Я пытаюсь избежать этого:

int openable(const char*filename) {
    FILE *f = fopen(filename,"r");
    if (!f)
        return 0; /* openable */
    fclose(f);
    return 1; /* not openable */
}

Из того, что я могу сказать, stat () в простейшем виде может использоваться для проверки, существует ли файл, но не для проверки, действительно ли он открыт.

Ответы [ 3 ]

3 голосов
/ 16 марта 2009

Стандартным решением POSIX является <a href="http://www.opengroup.org/onlinepubs/000095399/functions/access.html" rel="nofollow noreferrer">access</a>(), которое также находится во время выполнения Windows как <a href="http://msdn.microsoft.com/en-us/library/1w06ktdy%28VS.80%29.aspx" rel="nofollow noreferrer">_access()</a>.

Я думаю, это немного лучше, чем fopen() + fclose(), потому что:

  • Это общеизвестное стандартное решение проблемы проверки файла на права доступа
  • Скорее всего, быстрее, с меньшими затратами памяти

Конечно, он так же восприимчив к условиям гонки, как и любой другой способ проведения такого теста. В некотором смысле, единственный безопасный способ узнать, доступен ли файл для чтения, - это открыть его и попробовать прочитать, не закрывая его между ними. Даже тогда вам, конечно, нужно следить за «неожиданным» EOF. Ввод / вывод сложен.

1 голос
/ 16 марта 2009

Я думаю, что то, что у вас есть, вероятно, примерно так же хорошо, как вы получите (хотя ваши комментарии обратны тем, какими они должны быть). Есть много вещей, которые могут помешать открытию файла: права доступа, что-то еще удерживающее его открытым, нехватка ресурсов и т. Д.

Чтобы точно пройти все эти проверки, вы можете просто открыть вещь.

Однако учтите также, что в большинстве систем то, что вы возвращаете, может быть ложью для вызывающей стороны - к тому времени, как вы вернули указание вызывающей стороне о том, можно ли открыть файл или нет, о состоянии систем может измениться (например, что-то, что удерживало открытый файл, может закрыть его). Таким образом, единственный действительно эффективный способ узнать, могут ли они открыть и использовать файл, - это просто открыть и использовать файл (и обработать все ошибки).

Другими словами, если вы вернете '1007 *' своему абоненту, он может попытаться открыть файл, и он все равно может потерпеть неудачу.

1 голос
/ 16 марта 2009

Есть много факторов, которые вам нужно проверить, прежде чем вы узнаете, что файл «открываем», и попытка проверить их все кросс-платформенным способом будет глупо.

Я думаю, что вы делаете сейчас просто и безопаснее. Однако помните, что тот факт, что файл "открываем" сейчас не означает, что он останется, когда вы действительно откроете его. Ничто не мешает ему измениться между тем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...