unity如何開啟外部EXE(資料路徑Application.dataPath應用)
1、直接上程式碼,不用多說。
using System。Collections;
using System。Collections。Generic;
using UnityEngine;
using System。Diagnostics;
using System。IO;
using UnityEngine。UI;
public class OpenExe : MonoBehaviour {
public Button VrButton;
public Button DanJiButton;
void Start ()
{
VrButton。onClick。AddListener(OpenVR);
DanJiButton。onClick。AddListener(OpenDanJI);
}
public void OpenVR()
{
****string str = Application。dataPath + “/Resources/MyFile/xxx。exe”;
if (File。Exists(str) ==true)
{
Process。Start(str);
}
else if (File。Exists(str) == false)
{
Directory。CreateDirectory(str);
}
1
2
3
4
5
}
}
2、釋出完工程後,在Resources下面新建資料夾,起名為MyFile,,將對應相應的外部EXE工程複製到此路徑下,將路徑標好,對應相應的EXE。
3、點選試一下。
4、這麼做好處,在於隨便哪個盤,便可引用外部EXE,關鍵在於Application。dataPath,不多說了。
附加
:Application。temporaryCachePath和Application。persistentDataPath返回空字串。便花時間認真研究了一下Unity3D的路徑問題。我們常用的是以下四個路徑:
Application.dataPath
Application。streamingAssetsPath
Application。persistentDataPath
Application。temporaryCachePath
根據測試,詳細情況如下:
iOS:
Application。dataPath /var/containers/Bundle/Application/app sandbox/xxx。app/Data
Application。streamingAssetsPath /var/containers/Bundle/Application/app sandbox/test。app/Data/Raw
Application。temporaryCachePath /var/mobile/Containers/Data/Application/app sandbox/Library/Caches
Application。persistentDataPath /var/mobile/Containers/Data/Application/app sandbox/Documents
iOS和Mac OS X不同於Windows,app都是在一個沙盒空間中執行,每個app也有一個獨立的資料儲存空間,各app彼此不能互相訪問、打擾。
dataPath是app程式包安裝路徑,app本身就在這裡,此目錄是隻讀的。streamingAssetsPath是dataPath下的Raw目錄。
app的獨立資料儲存目錄下有三個資料夾:Documents,Library和tmp。
Documents目錄,這個目錄用於儲存需要長期儲存的資料,比如我們的熱更新內容就寫在這裡。需要注意的是,iCloud會自動備份此目錄,如果此目錄下寫入的內容較多,稽核的可能會被蘋果拒掉。
Library目錄,
這個目錄下有兩個子目錄,Caches和Preferences。
Caches
是一個相對臨時的目錄,適合存放下載快取的臨時檔案,空間不足時可能會被系統清除,Application。temporaryCachePath返回的就是此路徑。我把熱更新的臨時檔案寫在這裡,等一個版本的所有內容更新完全後,再把內容轉移到Documents目錄。
Preferences
用於應用儲存偏好設定,用NSUserDefaults讀取或設定。
tmp目錄
,臨時目錄,存放應用執行時臨時使用的資料。
需要注意的是,以上無論臨時、快取或者普通目錄,如果不需要的資料,都請刪除。不要佔用使用者的儲存空間,像微信就是壞榜樣。
下面是各路徑對應的OC訪問方法
app安裝路徑: [[NSBundle mainBundle] resourcePath]
app資料沙盒儲存根目錄: NSHomeDirectory()
Documents: NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
Library: NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)
Caches: NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)
tmp: NSTemporaryDirectory()
Android:
Application。dataPath /data/app/package name-1/base。apk
Application。streamingAssetsPath jar:file:///data/app/package name-1/base。apk!/assets
Application。temporaryCachePath /storage/emulated/0/Android/data/package name/cache
Application。persistentDataPath /storage/emulated/0/Android/data/package name/files
看Android上的路徑,跟iOS有點類似,簡單說一下。Android的幾個目錄是apk程式包、記憶體儲存(InternalStorage)和外部儲存(ExternalStorage)目錄。
apk程式包目錄:
apk的安裝路徑,/data/app/package name-n/base。apk,dataPath就是返回此目錄。
內部儲存目錄: /data/data/package name-n/,使用者自己或其它app都不能訪問該目錄。開啟會發現裡面有4個目錄(需要root)
cache 快取目錄,類似於iOS的Cache目錄
databases 資料庫檔案目錄
files 類似於iOS的Documents目錄
shared_prefs 類似於iOS的Preferences目錄,用於存放常用設定,比如Unity3D的PlayerPrefs就存放於此
外部儲存目錄:
在內建或外插的sd上,使用者或其它app都可以訪問,外部儲存目錄又分私有和公有目錄。
公有目錄是像DCIM、Music、Movies、Download這樣系統建立的公共目錄,當然你也可以像微信那樣直接在sd卡根目錄建立一個資料夾。好處嘛,就是解除安裝app資料依舊存在。
私有目錄在/storage/emulated/n/Android/data/package name/,開啟可以看到裡面有兩個資料夾cache和files。為什麼跟內部儲存目錄重複了?這是為了更大的儲存空間,以防記憶體儲存空間較小。推薦把不需要隱私的、較大的資料存在這裡,而需要隱私的或較小的資料存在內部儲存空間。
下面是各路徑對應的Java訪問方法:
apk包內: AssetManager.open(String filename)
內部儲存: context。getFilesDir()。getPath() or context。getCacheDir()。getPath()
外部儲存: context。getExternalFilesDir(null)。getPath() or context。getExternalCacheDir()。getPath()
理解了Android儲存的原理,最後來說說開頭提到的bug,Application。temporaryCachePath/persistentDataPath返回空字串。這其實因為許可權的原因,app沒有宣告訪問外部儲存空間的許可權,但是Application。temporaryCachePath/ ApplicationpersistentDataPath卻想返回外部儲存的路徑。這是Unity3D的bug,沒有許可權本應該丟擲一個異常或者錯誤,讓開發者知道原因。
經反覆測試發現,有【外接SD卡】的裝置上,如果宣告讀/寫外部儲存裝置的許可權,會返回外部儲存路徑,不宣告則會返回內部儲存路徑,這樣不會有問題。而在【無外接SD卡】的裝置上,不管是否宣告讀/寫外部儲存裝置的許可權,Application.temporaryCachePath/persistentDataPath都返回外部儲存路徑,但是又沒有許可權,就可能會導致返回null了,之所以說可能是因為這個bug不是必現,如果出現了裝置重啟之後就好了,懷疑是linux裝置mount問題。但是出了問題,我們不能跟使用者說你重啟一下手機就好了。
1
1
Windows:
Application。dataPath: 應用的appname_Data/
Application。streamingAssetsPath: 應用的appname_Data/StreamingAssets
Application。temporaryCachePath: C:\Users\username\AppData\Local\Temp\company name\product name
Application。persistentDataPath: C:\Users\username\AppData\LocalLow\company name\product name