在網上查了許多資料,現在把兩種方式都總結一下:
//Win32 API方式
QDir dir(qstring_fileDir) //qstring_fileDir 文件路徑
Qstring FileShellCommand = dir.absoluteFilePath(qstring_filename) //qstring_filename 文件名
FileShellCommand.replace("/", "\\"); //win32下替換斜槓
FileShellCommand.append("/select,");
ShellExecuteW(NULL, _T("open"), _T("Explorer.exe"), FileShellCommand.toStdWString().c_str(), NULL, SW_SHOWDEFAULT);
可以直接調用windows內置函數,關於這個函數的使用網上有很多優秀講解,在這裏重要說下函數的返回值,此函數返回HINSTANCE類型,大於32則說明打開成功。其實相當於調用了一次cmd,可以在powershell下多嘗試幾次
//QProcess方式
QDir dir(qstring_fileDir) //qstring_fileDir 文件路徑
Qstring FileShellCommand = dir.absoluteFilePath(qstring_filename) //qstring_filename 文件名
FileShellCommand.replace("/", "\\"); //win32下替換斜槓
QProcess process;
process.startDetached("explorer", QStringList() << QString("/select,") << QString("%1").arg(FileShellCommand));
process.waitForFinished();
使用Qprocess需要注意一下幾點:
1.process.startDetached是fork了一個子進程啓動外部程序,不過子進程與父進程脫離了父子關係
2.QProcess調用外部命令是不允許路徑帶空格的,類似於C:\Program Files這樣的,因爲qt是根據空格來解析命令的,所以會造成歧義導致失敗,這時候就需要QStringList來幫忙了,如上圖代碼,將"/select,"和文件路徑名當作參數傳遞給Process執行,這樣就可以萬無一失的打開文件夾並選中文件了