2016-03-04 3 views
1

Я пытаюсь реорганизовать очень старый кусок кода, который генерирует файл журнала:Рефакторинг fopen_s

FILE *File = NULL; 

    errno_t err = fopen_s(&File, m_pApp->LogFilename(), "a+");  // Open log file to append to 

    if (err == 0) 
    { 
     ::fprintf(File, "Date,Time,Serial Number,ASIC Voltage,Ink Temp,Heater Temp, Heater Set Point, PSOC Version,"); 
     if (m_ExtraLog) 
      ::fprintf(File, "T1 Temperature,ASIC Temperature,Proc Temperature,Voltage mA"); 
     ::fprintf(File, "\n"); 
     fclose(File); 
    } 

Причиной рефакторинга является то, что некоторые пользователи сообщают о том, что не удается скопировать файл, являющийся (они хотят скопировать его, чтобы его можно было проанализировать с помощью программы labview). Я прочитал документацию, посвященную fopen_s, и увидел, что «файлы, открытые fopen_s и _wfopen_s, не распространяются» - это причина моей проблемы? Я не уверен, потому что на самом деле я не вижу проблемы с копированием и, похоже, могу скопировать и вставить файл без проблем. В любом случае, я заменил его с рекомендуемой _fsopen функции следующим образом:

FILE *File = NULL; 

if((File = _fsopen(m_pApp->LogFilename(),"a+", _SH_DENYNO))!= NULL) 
    { 
     ::fprintf(File, "Date,Time,Serial Number,ASIC Voltage,Ink Temp,Heater Temp, Heater Set Point, PSOC Version,"); 

     if(m_ExtraLog) 
     { 
      ::fprintf(File, "T1 Temperature,ASIC Temperature,Proc Temperature,Voltage mA"); 
     } 

     ::fprintf(File, "\n"); 
     fclose(File); 
    } 

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

+0

я предполагаю, из цитаты из документов, которые вы используете Windows, это правильно? – SirDarius

+0

Как часто эта функция называется? Ни одна из версий не должна иметь никаких конфликтов дескрипторов после вызова 'fclose()'. Либо другая программа просто пытается открыть журнал, пока вы его пишете (очень возможно, если эта функция вызывается много раз в секунду), или что-то еще происходит. –

+0

Это действительно Windows или, точнее, MSVC++. Это не стандартная функция. – MSalters

ответ

0

Позволяет иметь вид в doc

Открыть файл. Это версии fopen, _wfopen с улучшениями безопасности, как описано в разделе «Улучшения безопасности в CRT».

Следовать по: link

Мы можем прочитать:

Filesystem безопасности. Защищенные файловые API-интерфейсы ввода-вывода поддерживают безопасный доступ к файлам в случае по умолчанию.

Так, чтобы исправить это, вы должны изменить «безопасности файла», чтобы соответствовать «всем пользователям/доступ для чтения»