重构fopen_s

时间:2016-03-04 08:55:28

标签: c++

我正在尝试重构一段生成日志文件的旧代码:

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 ++的了解非常有限,所以我想知道为什么生成的文件无法被另一个进程复制的其他解释?

1 个答案:

答案 0 :(得分:0)

让我们看看doc

  

打开一个文件。这些是fopen,_wfopen的版本,具有安全性增强功能,如CRT中的安全性增强功能中所述。

跟随:link

我们可以阅读:

  

文件系统安全性。在默认情况下,安全文件I / O API支持安全文件访问。

所以要解决这个问题,你必须改变文件的安全性'匹配所有用户/读取访问权限#39;