Windowsエクスプローラー/ OS X Finderでフォルダーを開き、そのフォルダー内の1つのファイルを選択/強調表示して、クロスプラットフォームの方法でそれを行うことは可能ですか?現在、私は次のようなことをしています
QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );
ここで、path
は、開きたいフォルダへのフルパスです。明らかに、これはフォルダを開くだけなので、必要なファイルを手動で追跡する必要があります。そのフォルダーに何千ものファイルがある場合、これは少し問題です。
そのフォルダー内の特定のファイルへのパスにすると、そのファイルはそのMIMEタイプのデフォルトのアプリケーションで開かれますが、これは必要ありません。代わりに、「Reveal in Finder」または「Show in Explorer」と同等の機能が必要です。
Qt Creator ( source )にはこの機能があり、コピーするのは簡単です:
void FileUtils::showInGraphicalShell(QWidget *parent, const QString &pathIn)
{
const QFileInfo fileInfo(pathIn);
// Mac, Windows support folder or file.
if (HostOsInfo::isWindowsHost()) {
const FileName Explorer = Environment::systemEnvironment().searchInPath(QLatin1String("Explorer.exe"));
if (Explorer.isEmpty()) {
QMessageBox::warning(parent,
QApplication::translate("Core::Internal",
"Launching Windows Explorer Failed"),
QApplication::translate("Core::Internal",
"Could not find Explorer.exe in path to launch Windows Explorer."));
return;
}
QStringList param;
if (!fileInfo.isDir())
param += QLatin1String("/select,");
param += QDir::toNativeSeparators(fileInfo.canonicalFilePath());
QProcess::startDetached(Explorer.toString(), param);
} else if (HostOsInfo::isMacHost()) {
QStringList scriptArgs;
scriptArgs << QLatin1String("-e")
<< QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"")
.arg(fileInfo.canonicalFilePath());
QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
scriptArgs.clear();
scriptArgs << QLatin1String("-e")
<< QLatin1String("tell application \"Finder\" to activate");
QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
} else {
// we cannot select a file here, because no file browser really supports it...
const QString folder = fileInfo.isDir() ? fileInfo.absoluteFilePath() : fileInfo.filePath();
const QString app = UnixUtils::fileBrowser(ICore::settings());
QProcess browserProc;
const QString browserArgs = UnixUtils::substituteFileBrowserParameters(app, folder);
bool success = browserProc.startDetached(browserArgs);
const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
success = success && error.isEmpty();
if (!success)
showGraphicalShellError(parent, app, error);
}
}
別の関連するブログ投稿(より単純なコードで、私は試していないのでコメントできない)は this です。
編集:
WindowsでpathInにスペースが含まれている場合、元のコードにバグがあります。 QProcess :: startDetached は、スペースが含まれているパラメーターを自動的に引用します。ただし、Windowsエクスプローラーは引用符で囲まれたパラメーターを認識せず、代わりにデフォルトの場所を開きます。 Windowsコマンドラインで自分で試してください:
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);
おそらく、_QFileDialog::getOpenFileName
_を使用してファイル名を取得できます。ドキュメントは利用可能です here ..上記の関数はファイル名とその拡張子を含む完全なパスを返します存在する場合..
その後、あなたは与えることができます
QDesktopServices::openUrl(path);
デフォルトのアプリケーションでファイルを開くには、path
は_QFileDialog::getOpenFileName
_によって返されるQString
になります。
それが役に立てば幸い..
Windowsエクスプローラーでファイルを開く(ブラウザーではない)
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);
}
これは、以前の回答からの入力に基づいて使用したコードです。このバージョンはQt Creatorの他のメソッドに依存せず、ファイルまたはディレクトリを受け入れ、エラー処理および他のプラットフォーム用のフォールバックモードを備えています。
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()));
}
このソリューションは、WindowsとMacの両方で機能します。
void showFileInFolder(const QString &path){
#ifdef _WIN32 //Code for Windows
QProcess::startDetached("Explorer.exe", {"/select,", QDir::toNativeSeparators(path)});
#Elif defined(__Apple__) //Code for Mac
QProcess::execute("/usr/bin/osascript", {"-e", "tell application \"Finder\" to reveal POSIX file \"" + path + "\""});
QProcess::execute("/usr/bin/osascript", {"-e", "tell application \"Finder\" to activate"});
#endif
}