Каковы возможные причины ошибки 22 с _tfopen? - PullRequest
0 голосов
/ 11 января 2019

Я предоставляю клиенту приложение, разработанное на Visual C ++, и оно хорошо работает в моей среде. К сожалению, мой клиент получает ошибку 22, когда _tfopen это вызов.

Вот небольшой фрагмент кода, похожий на код, который я написал в этом приложении:

#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.

Примечания:

  • Я знаю, _tfopen устарел, я также создал версию, которая использует _tfopen_s, проблема все еще существует.
  • Это не дубликат этого вопроса , потому что, в моем случае, у меня нет ошибки, и я хочу воспроизвести ее (чтобы понять, как ее исправить).

1 Ответ

0 голосов
/ 16 января 2019

Я последовал идее @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 для получения более точного кода ошибки. И это работает очень хорошо, потому что я получил ошибка 1326 :

Неверное имя пользователя или пароль.

Итак, теперь я могу сделать вывод, что _tfopen может выдать ошибку 22, когда не удается войти на удаленный файловый сервер. Эта ошибка отличается от ошибки 13 (В доступе отказано), поскольку ошибка 13 означает, что пользователь правильно вошел в систему.

...