選單

unity如何開啟外部EXE(資料路徑Application.dataPath應用)

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