2009-11-12 3 views
2

Я пытаюсь открыть выходной файл, который, я уверен, имеет уникальное имя, но он терпит неудачу раз в то время. Я не мог найти какую-либо информацию о том, по каким причинам конструктор потока может выйти из строя.Почему сервер не смог открыть файл на C++? Причины?

EDIT: Он начинает сбиваться в какой-то момент времени, и после того, что он постоянно терпит неудачу, пока я не остановить запущенную программу, записать этот файл.

EDIT: раз в то время = 22-24 часов

фрагмент кода (я это не помогло бы, но все-таки кто-то попросил его)

ofstream theFile(sLocalFile.c_str(), ios::binary | ios::out); 
if (theFile.fail()) 
{ 
    std::string sErr = " failed to open "; 
    sErr += sLocalFile; 
    log_message(sErr); 
    return FILE_OPEN_FAILED; 
} 
+0

Определите «один раз через некоторое время». – Alex

+10

@windfinder: 'while (true) {fail(); ломать; } '. –

+0

Что вы подразумеваете под уникальным именем? вы используете _tmpfile или какой-либо другой метод для создания уникального имени файла? Это для окон? – Matt

ответ

10

Слишком много ручек файлов открыто? Из космоса? Доступ закрыт? Проблема с прерывистым сетевым диском? Файл уже существует? Файл заблокирован? Это ужасно сложно сказать без каких-либо подробностей. Редактировать: Основываясь на дополнительных данных, которые вы указали, это звучит так, будто вы можете пропустить файловые дескрипторы (открывать файлы и не закрывать их, и поэтому заканчивается ограничение дескриптора файла для каждого процесса).

Я предполагаю, что вы знакомы с использованием exceptions method для управления сбоями iostream как исключениями или флагами состояния.

По моему опыту, классы iostream дают очень мало информации о том, что пошло не так, когда они терпят неудачу во время операции ввода-вывода. Однако, поскольку они, как правило, реализуются с использованием функций стандартного C и OS API более низкого уровня, вы можете получить более подробный код ошибки C или ОС. Мне посчастливилось использовать следующую функцию для этого.

std::string DescribeIosFailure(const std::ios& stream) 
{ 
    std::string result; 

    if (stream.eof()) { 
    result = "Unexpected end of file."; 
    } 

#ifdef WIN32 
    // GetLastError() gives more details than errno. 
    else if (GetLastError() != 0) { 
    result = FormatSystemMessage(GetLastError()); 
    } 
#endif 

    else if (errno) { 
#if defined(__unix__) 
    // We use strerror_r because it's threadsafe. 
    // GNU's strerror_r returns a string and may ignore buffer completely. 
    char buffer[255]; 
    result = std::string(strerror_r(errno, buffer, sizeof(buffer))); 
#else 
    result = std::string(strerror(errno)); 
#endif 
    } 

    else { 
    result = "Unknown file error."; 
    } 

    boost::trim_right(result); // from Boost String Algorithms library 
    return result; 
} 
2

Вы могли бы быть вне пространства, или может возникнуть проблема с разрешением. OS также может заблокировать файл. Попробуйте другое имя/путь для ударов и посмотрите, работает ли оно тогда.

+0

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

1

Возможно, у вас есть еще один экземпляр той же программы.

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

Смежные вопросы