問題描述
是否可以在 Windows 資源管理器/OS X Finder 中打開一個文件夾,然后選擇/突出顯示該文件夾中的一個文件,并以跨平臺方式執行此操作?現在,我做類似的事情
Is it possible to open a folder in Windows Explorer/OS X Finder and then select/highlight one file in that folder, and do it in a cross platform way? Right now, I do something like
QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );
其中 path
是我要打開的文件夾的完整路徑.顯然,這只會打開文件夾,我必須手動追蹤我需要的文件.當該文件夾中有數千個文件時,這有點問題.
where path
is a full path to folder I want to open. Obviously, this will just open the folder, and I'll have to track down the file I need manually. This is a bit of a problem when there are thousands of files in that folder.
如果我將其設置為該文件夾中特定文件的路徑,則該文件將使用該 MIME 類型的默認應用程序打開,這不是我所需要的.相反,我需要相當于在 Finder 中顯示"或在資源管理器中顯示"的功能.
If I make it a path to specific file in that folder, then that file is open with default application for that mime type, and that is not what I need. Instead, I need the functionality equivalent to "Reveal in Finder" or "Show in Explorer".
推薦答案
Qt Creator (source)這個功能,簡單復制一下:
Qt Creator (source) has this functionality, it's trivial to copy it:
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);
}
}
另一篇相關的博文(代碼比較簡單,我沒試過所以無法評論),是這個.
Another, related blog post (with simpler code, I haven't tried it so I can't comment), is this.
Windows 上 pathIn 包含空格時,原始代碼中存在錯誤.QProcess::startDetached 會自動引用包含空格的參數.但是,Windows 資源管理器不會識別用引號括起來的參數,而是會打開默認位置.在 Windows 命令行中自行嘗試:
There is a bug in the original code when pathIn contains spaces on Windows. QProcess::startDetached will automatically quote a parameter if it contains spaces. However, Windows Explorer will not recognize a parameter wrapped in quotes, and will open the default location instead. Try it yourself in the Windows command line:
echo. > "C:a file with space.txt"
:: The following works
C:Windowsexplorer.exe /select,C:a file with space.txt
:: The following does not work
C:Windowsexplorer.exe "/select,C:a file with space.txt"
因此,
QProcess::startDetached(explorer, QStringList(param));
改為
QString command = explorer + " " + param;
QProcess::startDetached(command);
這篇關于如何“在 Finder 中顯示"或“在資源管理器中顯示"與 Qt的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!