Home > Mobile >  How do I know whether FileInputStream opens a file?
How do I know whether FileInputStream opens a file?

Time:09-21

I am using Poco::FileInputStream to design a copy function

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

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

Then, a user can call do_copy_file like this

Poco::FileInputStream fis;
do_copy_file(fis);

My question: Can I judge whether iss refers a valid file?

CodePudding user response:

The Poco::FileOutputStream just throws a Poco::FileException if an error occurs when trying to open it, e.g. if a invalid file path is used. It doesn't have any function to test whether it is valid.

What you could do is change your do_copy_file() function to catch an Poco::FileException exception and return a boolean value - true if opened successfully or false otherwise:

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

Then you call it like this:

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

If you want do_copy_file() to catch an exception for opening the input stream I would recommend doing that in the function itself. Instead of passing the input streams pass the file paths instead:

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