相關資料:
https://www.cnblogs.com/Roye/p/12705536.html 原作者出處
https://blog.csdn.net/qq_33485434/article/details/80509284 原作者出處
1、os獲取文件路徑
path, filename = os.path.split(os.path.abspath(__file__)) # 獲取當前文件的路徑
os.getcwd() # 獲取當前工作目錄
file_path = os.path.abspath(filename) # 獲取文件路徑
2、提取路徑中的盤符信息
disk = os.path.abspath(file_path)[:2]
3、提取fluent路徑
fluent_path = “C:\Program Files\ANSYS Inc\v201\fluent\ntbin\win64\fluent”
4、組合cmd命令行(跳轉到文件盤符D,跳轉到文件路徑D:\works,帶jou運行4核啟動fluent)
'D: && cd D:\works && “C:\Program Files\ANSYS Inc\v201\fluent\ntbin\win64\fluent” 3d -t4 -i test.jou'
意義:在工作路徑下啟動fluent,讀寫文件(jou、cas、msh)時可采用相對路徑
---------------------------------------華麗的分隔線---------------------------------------------
在QT程序中需要將某目錄和文件壓縮為一個rar的壓縮包,於是想到了在QT中通過QProcess類調用命令行的rar.exe來達到效果,但是沒想到QProcess類用起來很麻煩,而且達不到效果,折騰了2天仍然沒找到原因,使用另外一種辦法解決了。
創建壓縮包的方法
在windows平台創建壓縮包,可以直接使用rar.exe,該程序在安裝winrar之后,在其安裝目錄下就可以找到。該程序是winrar對應的命令行版本,其語法例子如下:
rar.exe a -k -r -s -m1 test.rar direct1/ direct2/ test.txt
例子對應的目錄結構如下:
上面的命令表示在當前目錄下創建壓縮包 test.rar ,將當前目錄下的 direct1目錄以及其所有子目錄和文件、direct2目錄以及其子目錄和文件、當前目錄下的文件test.txt 都添加到test.rar壓縮包中。
其中參數a表示添加到壓縮包
參數-r表示遞歸添加
命令的問題解決了之后,那么下面就是如何在QT中調用該命令,實際上在QT中調用該命令就出現了很多問題。
在QT中調用命令行
QT中調用外部命令一般使用QProcess類提供的成員函數,其使用的具體代碼如下:
1 2 3 4 |
|
套用上面的代碼得到如下:
|
可以生成test.rar但是,該壓縮包中將路徑E:/test_rar_course也壓縮進去了,而我需要的是打開壓縮包之后僅僅看到direct1,direct2,test.txt3個項目,那么是不是設置一下工作目錄就可以了呢:
|
我不僅添加-w參數(該參數為rar.exe的命令行參數,用於指定工作目錄)為rar.exe命令指定工作目錄,同時利用p.setWorkingDirectory()為啟動的進程指定工作目錄,運行之后報錯,說找不到文件,我猜可能還是工作目錄的問題,但是不知道問題在哪里,查了很多資料都無濟於事,最終還是放棄了這種嘗試,改成了下面的嘗試:
|
而test.bat的內容為如下:
1 2 |
|
我直接在bat中通過cd命令切換工作目錄,然后進行壓縮,其中為了避免出現壓縮絕對路徑的情況,direct1,direct2,test.txt使用的都是相對路徑,直接鼠標雙擊該test.bat運行OK,放在QT中運行OK,似乎完美的解決了問題。
但是我發現,如果目錄中出現()括號字符就不行了,當有括號字符的時候在QProcess執行的報錯中顯示路徑被括號截斷,此后我把路徑用引號引起來沒效果:
"\"E:/test_rar_course(xx)/test.bat\""
根據網上搜索到的信息,用^符號對括號進行轉義沒有截斷的報錯了,但是命令執行還是沒有效果,控制台也沒有報錯:
"E:/test_rar_course^(xx^)/test.bat"
到這里我不知道該怎么樣去達到我的效果,唯一的感覺QProcess怎么這么難用,如果有知道的QT大神,煩請告訴一下。我想到用另外一種方式來實現,就是用C++寫一個dll實現,然后QT中調用。
在QT中調用C++創建的dll
主要代碼如下,實際上就是調用system函數,但是如果路徑中有圓括號,還是需要用^符號進行轉義,否則system執行也有問題:
|
但是除了圓括號要轉義以外,還存在一個很不舒服的問題,就是每次執行都會彈出cmd的黑窗口,執行完成之后,窗口消失,代碼改成下面的就好了:
到此完美解決該問題,既不需要對圓括號進行轉義,同時也隱藏了黑窗口了。當然前述的test.bat的內容要在程序中動態生成,利用合適的路徑替換掉test.bat中的路徑。 |
最后調用如:SystemTool::GenerateIndexRar("E:/test_rar_course(xx)/test.bat");