Как использовать подстановочные знаки имени файла с QCommandLineParser - PullRequest
0 голосов
/ 20 ноября 2018

Есть ли проблема с QCommandLineParser и подстановочными знаками имен файлов в Windows?

Я использую Qt 5.8.0 с открытым исходным кодом в Windows для создания консольного приложения.Я пытаюсь создать утилиту командной строки, которая принимает подстановочные знаки имени файла.Похоже, это не работает, так как он вызывает метод process ().

main.cpp :

#include <QCoreApplication>
#include <QCommandLineParser>
#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char** argv)
{
   QCoreApplication app(argc, argv);
   QCommandLineParser parser;
   parser.addPositionalArgument("files", "input files", "[file]...");
   parser.process(app);
   QStringList posargs = parser.positionalArguments();
   foreach(QString s, posargs)
      cout << s.toStdString() << endl;
   return EXIT_SUCCESS;
}

myapp.pro

CONFIG += c++14 console release
QT -= gui
sources = main.cpp

Когда я использую команду:

myapp somefile.txt

Я получаю somefile.txt

Но это не работает скоманда:

myapp *.txt

Как лучше всего обойтись?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Пока это не будет исправлено, мое решение состоит в том, чтобы заключить в параметры параметры с подстановочными знаками в них в одинарных кавычках.Затем проанализируйте шаблон таким образом, который был предложен Toby Speight :

int main(int argc, char** argv)
{
   QCoreApplication app(argc, argv);
   QCommandLineParser parser;
   parser.addPositionalArgument("files", "input files", "[file]...");
   parser.process(app);
   QStringList posargs = parser.positionalArguments();
   for(auto s: posargs)
   {
      if(s.startsWith("'") && s.endsWith("'"))
         s = s.mid(1,s.length()-2);
      QFileInfo fi(s);
      QDirIterator iter(fi.path(), QStringList() << fi.fileName(), QDir::Files);
      while(iter.hasNext())
      {
         QString filename = iter.next();
         cout << s.toStdString() << endl;
      }
   }
   return EXIT_SUCCESS;
}
0 голосов
/ 20 ноября 2018

QCommandLineParser просто сохраняет и получает аргументы командной строки.Он ничего не знает о файловой системе;если вы хотите расширить подстановочный знак, вам нужно взять QDir и самостоятельно установить его фильтр имен, например:

#include <QCoreApplication>
#include <QCommandLineParser>
#include <QDir>

#include <iostream>

int main(int argc, char** argv)
{
   QCoreApplication app(argc, argv);
   QCommandLineParser parser;
   parser.addPositionalArgument("files", "input files", "[file]...");
   parser.process(app);
   QStringList posargs = parser.positionalArguments();
   for (auto const& s: posargs) {
       auto d = QDir{};
       d.setNameFilters({s});
       for (const auto& name: d.entryList()) {
           std::cout << name.toStdString() << '\n';
       }
   }
}

Вам нужно быть немного умнее, чтобы принять произвольный путьКонечно, подстановочные знаки - здесь мы предполагаем, что в аргументе нет разделителя пути.

...