_tfopen错误22的可能原因是什么?

时间:2019-01-11 15:22:48

标签: c++ fopen

我向客户端提供了使用Visual C ++开发的应用程序,该应用程序在我的环境中运行良好。不幸的是,我的客户在致电_tfopen时收到错误22。

这里有一个小片段,类似于我在此应用程序中编写的代码:

#include "pch.h"

#include <iostream>
#include <stdio.h>
#include <wchar.h>
#include "tchar.h"

FILE* fp;

int openFile(const TCHAR* p, const TCHAR* r)
{
    errno_t err = 0;

    fp = _tfopen(p, r);
    if (!fp)
    {
        err = errno;

        _tprintf(_T("Error %d, can't open file: %s with rights %s"), err, p, r);
    }
    else
    {
        printf("All is ok\n");
    }
    return err;

}

int main()
{
    openFile(_T("\\\\127.0.0.1\\hidden_folder$\\folder\\video_file.mxf"), _T("rb"));
    return 0;
}

我的客户得到:

Error 22, can't open file: \\127.0.0.1\hidden_folder$\folder\video_file.mxf with rights rb

错误22表示无效参数的EINVAL。但是,就我而言,参数是正确的(根据日志)。
这种行为的原因可能是什么?

我尝试了很多方法来重现此错误:删除video_file.mxf,更改文件的位置,更改文件的权限,...没关系,我从未收到错误22。 / p>

注释:

  • 我知道_tfopen已被弃用,我还创建了一个使用_tfopen_s的版本,问题仍然存在。
  • 它不是this question的副本,因为就我而言,我没有错误,我想重现此错误(以了解如何更正错误)。

1 个答案:

答案 0 :(得分:0)

我遵循@Michael的想法,并将源代码更改为以下代码:

#include "pch.h"

#include <iostream>
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
#include "tchar.h"

FILE* fp;

int openFile(const TCHAR* p, const TCHAR* r)
{
    errno_t err = 0;

    fp = _tfopen(p, r);
    if (!fp)
    {
        err = errno;

        _tprintf(_T("Error %d, can't open file: %s with rights %s"), err, p, r);

        HANDLE hFile;
        hFile = ::CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

        if (hFile == INVALID_HANDLE_VALUE)
        {
            _tprintf(_T("GetLastError = %d"), GetLastError());
        }
        else
        {
            _tprintf(_T("No error with CreateFile"));
            CloseHandle(hFile);
        }
    }
    else
    {
        printf("All is ok\n");
    }
    return err;

}

int main()
{
    openFile(_T("\\\\127.0.0.1\\hidden_folder$\\folder\\video_file.mxf"), _T("rb"));
    return 0;
}

这个想法是继续使用_tfopen获取一个FILE指针(在我的应用程序中使用了很多时间),但是现在使用CreateFile来获取一个更精确的错误代码。而且效果很好,因为我得到了error 1326

  

用户名或密码不正确。

因此,现在,我可以得出结论,_tfopen在无法登录到远程文件服务器时会引发错误22。此错误与错误13(拒绝权限)不同,因为错误13表示用户已正确登录。