Search code examples
poco-libraries

How do I know whether FileInputStream opens a file?


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?


Solution

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