Refactoring fopen_s

Refactoring fopen_s

本文关键字:fopen Refactoring      更新时间:2023-10-16

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

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

让我们看看文档

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

关注方式:链接

我们可以阅读:

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

因此,要解决此问题,您必须更改"文件安全性"以匹配"所有用户/读取访问权限"