2010-09-01 4 views
3

В настоящее время я использую что-то вроде:Проверка существования файла в C++

#include <sys/stat.h> 

#include "My_Class.h" 

void My_Class::my_function(void) 
{ 
    std::ofstream my_file; 

    struct stat file_info; 

    if (filename_str.compare("")!=0 && 
     stat(filename_str.c_str(),&file_info) == 0) 
    { 
    my_file.open(filename_str.data(),std::ios::trunc); 
    //do stuff 
    my_file.close(); 
    } 
    else if (filename_str.compare("")==0) 
    { 
    std::cout << "ERROR! ... output filename not assigned!" << std::endl; 
    } 
    else 
    { 
    std::cout << "ERROR! File :" << std::endl 
      << filename_str << std::endl 
      << "does not exist!!" << std::endl; 
    } 
} 

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

Это НЕ домашнее задание, вопрос, это вопрос о лучшей практике.

ответ

3

Обычно я считаю, что лучше всего просто открыть его и поймать ошибку.

IMO, проверка разрешений неразумно, потому что, если это поле Linux, и вы проверяете его атрибуты, решите, что вы не можете писать на него, но файловая система поддерживает ACL, и они do предоставляют вам разрешение? (Как системный администратор я не могу подставить, когда приложения это делают. Мне нравится ACL, и если вы приложение, не говорите мне, что вы не можете писать в файл, если вы не пробовали сначала.)

+0

Следуйте за мантрой «Держите это просто ..». Если ваш код выглядит сложным или не простым, скорее всего это так. –

+0

Итак, просто используйте простой блок try {} catch? –

+0

Я пробовал этот код ... http://www.java2s.com/Tutorial/Cpp/0240__File-Stream/Readafileintrycatchblock.htm .... но когда файл не существует, мой исполняемый файл продолжает сбрасывать пустые строки на мой Терминал. Идеи, почему этот пример не сработал? Я буквально скопировал и вложил его в файл main.cc и просто запускал g ++ без флагов на нем и запускал результирующий исполняемый файл. –

4

Я бы использовал конструкции boost :: filesystem. Они не только пересекают платформу, но и являются частью следующей стандартной библиотеки.

+0

Я знал по крайней мере одного ветерана-кодера на прежнем рабочем месте, в котором говорилось, что Boost - это поход, но я не понял и не понял их логики о том, почему. Вы думаете, что это хорошая идея? –

+0

@ Джейсон: Подумайте об этом в течение секунды. Почему @Noah ответил на рекомендацию Boost, если он подумал, что это крушение поезда? –

+0

Возможно, потому что Boost может сделать отладку несколько сложной? Я не совсем уверен - Boost всегда был хорош для моих друзей и я. – SubSevn

0

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

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

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