首页 > 解决方案 > 我如何知道 FileInputStream 是否打开了文件?

问题描述

我正在使用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是否引用了有效文件吗?

标签: poco-libraries

解决方案


Poco::FileOutputStream如果在尝试打开它时发生错误,例如如果使用了无效的文件路径,则会抛出 Poco::FileException。它没有任何功能来测试它是否有效。

您可以做的是更改您的do_copy_file()函数以捕获 Poco::FileException 异常并返回一个布尔值 - 如果成功打开则返回 true,否则返回 false:

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;
}

推荐阅读