2013-09-19 4 views
2

Иногда мы вызываем странную проблему, когда вызываем boost::filesystem::copy(), чтобы скопировать файл из обычного локального раздела в один из размещенных на Lustre. Обычно, если мы делаем cp файлов, мы замечаем, что файл назначения существует правильно и доступен сразу после того, как возвращается cp, однако при операции форсирования, когда он возвращается, файл может быть всем или нет (в пункте назначения.)To :: close() или to :: fclose()?

Просматривая код буста, я вижу:

if (::close(infile) < 0) sz_read = -1; 
    if (::close(outfile) < 0) sz_read = -1; 

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

+5

'close' - это не то же самое, что' fclose'. Это файлы разных типов (дескрипторы файлов и дескрипторы файлов stdio). –

+0

'close (файловый дескриптор)' и 'fclose (поток файлов)' оба оставляют разные. дескриптор файла - это тип 'int'. Файловый поток - это 'FILE * '. мы будем использовать либо открытые, либо закрытые или fopen и fclose – Gangadhar

+0

... все дерьмо ... школьная ошибка! : { – Nim

ответ

2

Это зависит от того, как файл был открыт. Если он был открыт с конкретным ОС ::open, то он должен быть закрыт с ОС конкретным ::close. Если он был открыт с fopen, то он должен быть закрыт с fclose. И если он был открыт с (или конструктором fstream), то он должен быть закрыт, позвонив по объекту close.

Boost, по-видимому, использует системные вызовы низкого уровня. В этом случае нет буфера, который нуждается в промывке. Для fclose или fstream::close, то закрыть будет автоматически сбросить буфер. Не требуется явный флеш.

+0

... <висит голова в позоре /> ... ладно, еще нужно выяснить, почему скопированный файл отсутствует ...: / – Nim

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