c++ - Qt के साथ "खोजक में प्रकट करें" या "एक्सप्लोरर में दिखाएं" कैसे करें




qt4 (3)

यहां एक कोड है जिसे मैंने पिछले उत्तर से इनपुट के आधार पर किया था। यह संस्करण Qt निर्माता में अन्य विधियों पर निर्भर नहीं है, फ़ाइल या निर्देशिका स्वीकार करता है, और त्रुटि प्रबंधन और अन्य प्लेटफ़ॉर्म के लिए फ़ॉल बैक मोड है:

void Util::showInFolder(const QString& path)
{
    QFileInfo info(path);
#if defined(Q_OS_WIN)
    QStringList args;
    if (!info.isDir())
        args << "/select,";
    args << QDir::toNativeSeparators(path);
    if (QProcess::startDetached("explorer", args))
        return;
#elif defined(Q_OS_MAC)
    QStringList args;
    args << "-e";
    args << "tell application \"Finder\"";
    args << "-e";
    args << "activate";
    args << "-e";
    args << "select POSIX file \"" + path + "\"";
    args << "-e";
    args << "end tell";
    args << "-e";
    args << "return";
    if (!QProcess::execute("/usr/bin/osascript", args))
        return;
#endif
    QDesktopServices::openUrl(QUrl::fromLocalFile(info.isDir()? path : info.path()));
}

क्या विंडोज एक्सप्लोरर / ओएस एक्स फाइंडर में एक फ़ोल्डर खोलना संभव है और फिर उस फ़ोल्डर में एक फ़ाइल का चयन / हाइलाइट करना संभव है, और इसे क्रॉस प्लेटफ़ॉर्म तरीके से करें? अभी, मैं कुछ ऐसा करता हूं

QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );

जहां path फ़ोल्डर के लिए एक पूर्ण path है जिसे मैं खोलना चाहता हूं। जाहिर है, यह सिर्फ फ़ोल्डर खोल देगा, और मुझे उस फ़ाइल को ट्रैक करना होगा जिसे मुझे मैन्युअल रूप से चाहिए। यह उस समस्या में थोड़ी सी समस्या है जब उस फ़ोल्डर में हजारों फाइलें हैं।

अगर मैं इसे उस फ़ोल्डर में विशिष्ट फ़ाइल का पथ बना देता हूं, तो वह फ़ाइल उस माइम प्रकार के लिए डिफ़ॉल्ट एप्लिकेशन के साथ खुलती है, और यह वही नहीं है जो मुझे चाहिए। इसके बजाय, मुझे "खोजक में प्रकट" या "एक्सप्लोरर में दिखाएं" के समतुल्य कार्यक्षमता की आवश्यकता है।


विंडोज एक्सप्लोरर में फ़ाइल खोलें (ब्राउजर नहीं)

void OpenFileInExplorer()
{
   QString path = "C:/exampleDir/example.txt";

   QStringList args;

   args << "/select," << QDir::toNativeSeparators(path);

   QProcess *process = new QProcess(this);
   process->start("explorer.exe", args); 

}

क्यूटी निर्माता ( source ) में यह कार्यक्षमता है, इसे कॉपी करने के लिए यह छोटा है:

void FolderNavigationWidget::showInGraphicalShell(QWidget *parent, const QString &pathIn)
{
    // Mac, Windows support folder or file.
#if defined(Q_OS_WIN)
    const QString explorer = Environment::systemEnvironment().searchInPath(QLatin1String("explorer.exe"));
    if (explorer.isEmpty()) {
        QMessageBox::warning(parent,
                             tr("Launching Windows Explorer failed"),
                             tr("Could not find explorer.exe in path to launch Windows Explorer."));
        return;
    }
    QString param;
    if (!QFileInfo(pathIn).isDir())
        param = QLatin1String("/select,");
    param += QDir::toNativeSeparators(pathIn);
    QString command = explorer + " " + param;
    QProcess::startDetached(command);
#elif defined(Q_OS_MAC)
    Q_UNUSED(parent)
    QStringList scriptArgs;
    scriptArgs << QLatin1String("-e")
               << QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"")
                                     .arg(pathIn);
    QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
    scriptArgs.clear();
    scriptArgs << QLatin1String("-e")
               << QLatin1String("tell application \"Finder\" to activate");
    QProcess::execute("/usr/bin/osascript", scriptArgs);
#else
    // we cannot select a file here, because no file browser really supports it...
    const QFileInfo fileInfo(pathIn);
    const QString folder = fileInfo.absoluteFilePath();
    const QString app = Utils::UnixUtils::fileBrowser(Core::ICore::instance()->settings());
    QProcess browserProc;
    const QString browserArgs = Utils::UnixUtils::substituteFileBrowserParameters(app, folder);
    if (debug)
        qDebug() <<  browserArgs;
    bool success = browserProc.startDetached(browserArgs);
    const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
    success = success && error.isEmpty();
    if (!success)
        showGraphicalShellError(parent, app, error);
#endif
}

एक और, संबंधित ब्लॉग पोस्ट (सरल कोड के साथ, मैंने कोशिश नहीं की है इसलिए मैं टिप्पणी नहीं कर सकता), this

संपादित करें:

मूल कोड में एक बग है जब पथइन में विंडोज़ पर रिक्त स्थान होते हैं। QProcess::startDetached स्वचालित रूप से पैरामीटर उद्धृत करेगा यदि इसमें रिक्त स्थान हैं। हालांकि, विंडोज एक्सप्लोरर कोट्स में लिपटे पैरामीटर को पहचान नहीं पाएगा, और इसके बजाय डिफ़ॉल्ट स्थान खुल जाएगा। विंडोज कमांड लाइन में इसे अपने आप आज़माएं:

echo. > "C:\a file with space.txt"
:: The following works
C:\Windows\explorer.exe /select,C:\a file with space.txt  
:: The following does not work
C:\Windows\explorer.exe "/select,C:\a file with space.txt"

इस प्रकार,

QProcess::startDetached(explorer, QStringList(param));

में बदल गया है

QString command = explorer + " " + param;
QProcess::startDetached(command);




qt4