实际开发过程中时常遇到这种情况:双击自定义的后缀类型(例如:.ext),想要调用(Test.exe)打开,这个时候就需要设定文件类型的关联了。
1. window(两种方式)
1.1 写注册表关联
/*******************************************************************
* 注册文件关联
* className // 自定义的类别
* appPath // 关联的程序目录
* ext // 关联的文件类型
* extDes // 该文件类型描述
*******************************************************************/
void registerFileRelation(const QString& className, const QString& appPath, const QString& ext, const QString& extDes)
{
QString baseUrl("HKEY_CURRENT_USER\\Software\\Classes"); // 要添加的顶层目录
QSettings settingClasses(baseUrl,QSettings::NativeFormat);
// 在...Classes\类别下创建一个新的类别,并设置该类别打开文件时的调用参数
settingClasses.setValue("/" + className + "/Shell/Open/Command/.","\"" + appPath + "\" \"%1\"");
// 文件类型描述
settingClasses.setValue("/" + className + "/.",extDes);
// 设置该类别的默认图标默认图标
settingClasses.setValue("/" + className + "/DefaultIcon/.",appPath + ",0");
// 关联ext 和 类别
settingClasses.setValue("/" + ext + "/OpenWithProgIds/" + className,"");
// 立即保存该修改
settingClasses.sync();
}
调用: QString className("LookExe"); // 自定义的类别 QString appPath("E:\\Asdst\\00ssag\\winExe\\test.exe"); // 关联的程序目录 QString ext(".ets"); // 关联的文件类型 QString extDes("查看"); // 该文件类型描述 registerFileRelation(className,appPath,ext,extDes);
1.2 使用assoc和ftype命令
相关命令行调用如下:
assoc .ets=etsfile
ftype etsfile="E:\\Asdst\\00ssag\\winExe\\test.exe" "%1"
说明:在QT中使用Qprocess调用(systme调用会有黑框闪现)
QString strAssoc = "assoc .eest=eestfile"; // 显示或修改文件扩展名的关联
QString strFtype = QString("ftype eestfile=\"%1\"").arg(QApplication::applicationFilePath()); // 显示或修改用在文件扩展名中的关联
strFtype.replace("/", "\\");
QProcess::startDetached("cmd.exe", QStringList() << "/c" << strAssoc + "\n");
QProcess::startDetached("cmd.exe", QStringList() << "/c" << strFtype + "%1 \n");
2. Linux
....do something