Как я узнаю, что FileInputStream открывает файл? - PullRequest
1 голос
/ 26 апреля 2020

Я использую Poco :: FileInputStream для разработки функции копирования

void do_copy_file(Poco::FileInputStream & iss)
{
    Poco::FileOutputStream fos("output.txt");

    Poco::StreamCopier::copyStream(iss, fos);
}

Затем пользователь может вызвать do_copy_file следующим образом

Poco::FileInputStream fis;
do_copy_file(fis);

Мой вопрос: могу ли я судить, относится ли iss к действительному файлу?

1 Ответ

1 голос
/ 26 апреля 2020

Poco :: FileOutputStream просто генерирует исключение Poco :: FileException, если при попытке открыть его возникает ошибка, например, если используется неверный путь к файлу. У него нет какой-либо функции для проверки, является ли она действительной.

Что вы можете сделать, это изменить свою функцию do_copy_file(), чтобы она перехватывала исключение Poco :: FileException и возвращала логическое значение - true в случае успешного открытия или в противном случае:

bool do_copy_file(Poco::FileInputStream & iss)
{
    bool result(true);

    try
    {
        Poco::FileOutputStream fos("output.txt");
        Poco::StreamCopier::copyStream(iss, fos);
    }
    catch (const Poco::FileException&)
    {
        result = false;
    }

    return result;
}

Затем вы называете это так:

Poco::FileInputStream fis;
if (do_copy_file(fis)
{
    //output file stream opened successfully
}

Если вы хотите, чтобы do_copy_file() перехватил исключение для открытия входного потока, я бы порекомендовал сделать это в самой функции. Вместо передачи входных потоков передайте пути к файлам:

bool do_copy_file(const std::string &inputFile, const std::string& outputFile)
{
    bool result(true);

    try
    {
        Poco::FileInputStream fis(inputFile);
        Poco::FileOutputStream fos(outputFile);
        Poco::StreamCopier::copyStream(fis, fos);
    }
    catch (const Poco::FileException&)
    {
        result = false;
    }

    return result;
}
...