2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-29 00:10:54 +00:00

Add QUtil::file_can_be_opened

This commit is contained in:
Jay Berkenbilt 2021-12-29 10:36:15 -05:00
parent ac0060ac38
commit af91b5b584
5 changed files with 29 additions and 18 deletions

View File

@ -1,3 +1,7 @@
2021-12-29 Jay Berkenbilt <ejb@ql.org>
* Add method QUtil::file_can_be_opened
2021-12-21 Jay Berkenbilt <ejb@ql.org> 2021-12-21 Jay Berkenbilt <ejb@ql.org>
* 10.5.0: release * 10.5.0: release

View File

@ -111,6 +111,10 @@ namespace QUtil
QPDF_DLL QPDF_DLL
FILE* fopen_wrapper(std::string const&, FILE*); FILE* fopen_wrapper(std::string const&, FILE*);
// Attempt to open the file read only and then close again
QPDF_DLL
bool file_can_be_opened(char const* filename);
// Wrap around off_t versions of fseek and ftell if available // Wrap around off_t versions of fseek and ftell if available
QPDF_DLL QPDF_DLL
int seek(FILE* stream, qpdf_offset_t offset, int whence); int seek(FILE* stream, qpdf_offset_t offset, int whence);

View File

@ -515,6 +515,21 @@ QUtil::fopen_wrapper(std::string const& description, FILE* f)
return f; return f;
} }
bool
QUtil::file_can_be_opened(char const* filename)
{
try
{
fclose(safe_fopen(filename, "rb"));
return true;
}
catch (std::runtime_error&)
{
// can't open the file
}
return false;
}
int int
QUtil::seek(FILE* stream, qpdf_offset_t offset, int whence) QUtil::seek(FILE* stream, qpdf_offset_t offset, int whence)
{ {

View File

@ -203,6 +203,9 @@ void fopen_wrapper_test()
std::cout << "exception: " << s.what() << std::endl; std::cout << "exception: " << s.what() << std::endl;
assert(s.getErrno() != 0); assert(s.getErrno() != 0);
} }
assert(QUtil::file_can_be_opened("qutil.out"));
assert(! QUtil::file_can_be_opened("/does/not/exist"));
} }
void getenv_test() void getenv_test()

View File

@ -740,21 +740,6 @@ static void parse_object_id(std::string const& objspec,
} }
} }
static bool file_exists(char const* filename)
{
try
{
fclose(QUtil::safe_fopen(filename, "rb"));
return true;
}
catch (std::runtime_error&)
{
// can't open the file
}
return false;
}
// This is not a general-purpose argument parser. It is tightly // This is not a general-purpose argument parser. It is tightly
// crafted to work with qpdf. qpdf's command-line syntax is very // crafted to work with qpdf. qpdf's command-line syntax is very
// complex because of its long history, and it doesn't really follow // complex because of its long history, and it doesn't really follow
@ -2976,7 +2961,7 @@ ArgParser::handleArgFileArguments()
argfile = 1 + argv[i]; argfile = 1 + argv[i];
if (strcmp(argfile, "-") != 0) if (strcmp(argfile, "-") != 0)
{ {
if (! file_exists(argfile)) if (! QUtil::file_can_be_opened(argfile))
{ {
// The file's not there; treating as regular option // The file's not there; treating as regular option
argfile = nullptr; argfile = nullptr;
@ -3276,7 +3261,7 @@ ArgParser::parsePagesOptions()
char const* file = argv[cur_arg++]; char const* file = argv[cur_arg++];
char const* password = 0; char const* password = 0;
char const* range = argv[cur_arg++]; char const* range = argv[cur_arg++];
if (! file_exists(file)) if (! QUtil::file_can_be_opened(file))
{ {
check_unclosed(file, 0); check_unclosed(file, 0);
} }
@ -3315,7 +3300,7 @@ ArgParser::parsePagesOptions()
// "." means the input file. // "." means the input file.
QTC::TC("qpdf", "qpdf pages range omitted with ."); QTC::TC("qpdf", "qpdf pages range omitted with .");
} }
else if (file_exists(range)) else if (QUtil::file_can_be_opened(range))
{ {
QTC::TC("qpdf", "qpdf pages range omitted in middle"); QTC::TC("qpdf", "qpdf pages range omitted in middle");
// Yup, it's a file. // Yup, it's a file.