是否可以在Windows资源管理器/ OS X Finder中打开文件夹,然后选择/突出显示该文件夹中的一个文件,并以跨平台方式执行此操作?现在,我做了类似
的事情QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );
其中path
是我要打开的文件夹的完整路径。显然,这只会打开文件夹,我将不得不手动追踪我需要的文件。当该文件夹中有数千个文件时,这有点问题。
如果我将它作为该文件夹中特定文件的路径,那么该文件是使用该mime类型的默认应用程序打开的,这不是我需要的。相反,我需要相当于“在Finder中显示”或“在资源管理器中显示”的功能。
答案 0 :(得分:39)
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。
编辑:
当pathIn在Windows上包含空格时,原始代码中存在错误。如果参数包含空格,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);
答案 1 :(得分:9)
您可以使用QFileDialog::getOpenFileName
获取文件名。该文档可用here ..上述功能将返回完整路径,包括文件名及其扩展名 (如果有) ..
然后你可以给
QDesktopServices::openUrl(path);
以默认应用方式打开文件,其中path
将是QString
返回的QFileDialog::getOpenFileName
。
希望有所帮助......
答案 2 :(得分:5)
在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);
}
答案 3 :(得分:2)
以下是我根据之前回答的输入进行的代码。此版本不依赖于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()));
}
答案 4 :(得分:0)
此解决方案在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
}