我向客户端提供了使用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
的版本,问题仍然存在。答案 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表示用户已正确登录。