首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#中Application的4大文件路径的用法详解

Application这个类如果用得好,可以产生很多意想不到的程序效果!

先说说Application里面包含的四大路径

Application.dataPath

Debug.Log(Application.dataPath);//只读路径,指向项目资源文件夹。//编辑器模式:项目根目录下的 Assets 文件夹。//发布后:安装包内的资源路径//Windows  C:/Build/XXX_Data文件夹//macOS    /Applications/XXX.app/Contents/Resources/Data//Android  /data/app/[包名]/base.apk(APK内部不能直接访问)//iOS/var/containers/Bundle/Application/[APP_UUID]/XXX.app/Data//WebGL  服务器资源路径(通过 HTTP 访问)//仅编辑器:读取Assets目录下的配置文件、资源。//发布后:通常不可写,且路径受平台限制,不建议直接使用。可运用场景:// 编辑器下读取 Assets/Config中的文件//#if UNITY_EDITOR// string configPath = Path.Combine(Application.dataPath, "Config/settings.json");// string json = File.ReadAllText(configPath);//#endif

Application.persistentDataPath

Debug.Log(Application.persistentDataPath);//可读写,适合保存用户生成的数据存档。//Windows/macOS:user/Administrator/AppData/Local)//Android/iOS:应用沙盒内的私有目录(如 /data/data/com.xxx.game/files)// 保存用户存档//string savePath = Path.Combine(Application.persistentDataPath, "save.dat");//File.WriteAllText(savePath, "PlayerLevel=10");可运用场景:一般单机游戏用来存放关卡分数较多//// 读取存档//if (File.Exists(savePath))//{//  string data = File.ReadAllText(savePath);//}

优点

跨平台可靠

persistentDataPath在所有平台均可读写,且路径由系统自动管理。

数据持久化

文件会保留在用户目录中,即使应用更新或重装也不会丢失。

无需特殊权限

系统已为应用分配了合法的可读写目录。

值得注意的是,PlayerPrefs存放的数据是在用户的平台注册表里,而非此目录

Application.streamingAssetsPath

Debug.Log(Application.streamingAssetsPath);//存放只读资源的路径,打包时原样包含在安装包中(只读)//Windows / macOS / Android:直接通过文件路径访问。出的包体里面包含StreamingAssets文件夹//iOS:资源在 .app 包内,需使用 UnityWebRequest 加载可运用场景//初始配置文件、视频、音频等无需修改的资源// 读取StreamingAssets中的JSON文件(跨平台方式)string configPath = Path.Combine(Application.streamingAssetsPath, "config.json");// Android/iOS 需用 UnityWebRequest#if UNITY_ANDROID || UNITY_IOS   StartCoroutine(LoadStreamingAsset(configPath));#else   string json = File.ReadAllText(configPath);#endifIEnumerator LoadStreamingAsset(string path) {   using (UnityWebRequest request = UnityWebRequest.Get(path)) {       yield return request.SendWebRequest();       if (request.result == UnityWebRequest.Result.Success) {           string json = request.downloadHandler.text;       }   }}

各平台下 streamingAssetsPath 的路径和写入验证

值得注意的是,虽然上面路径说是只读,但是我们Pc包中能通过流式写入,原因在于

Unity 在 Windows 平台的特殊处理 和 安装目录权限宽松 导致的,但这种行为不可靠、不跨平台且不符合 Unity 设计规范。如果将游戏安装在非系统目录(如D:\Games\YourGame),Windows 默认允许当前用户对安装目录进行读写操作。此时,Application.streamingAssetsPath指向的路径(如XXX_Data\StreamingAssets)可能允许代码写入文件。使用File.Create()和StreamWriter直接操作文件系统,绕过了 Unity 的资源管理机制。在 Windows 这种权限宽松的平台上,这种操作可能被系统允许。

当然有一种情况代码会报错,这种就是直接写入:

string filePath = Path.Combine(Application.streamingAssetsPath, "test.txt");File.WriteAllText(filePath, "Hello"); // 抛出异常:Access Denied

另外通过流式写入其实还有几个弊端

1. 跨平台不可靠

移动端(Android/iOS)

Application.streamingAssetsPath在移动端指向安装包内部(APK/IPA),严格只读,代码写入会直接失败。

WebGL

浏览器环境禁止直接文件操作,代码会抛出异常。

macOS

如果应用安装在/Applications等系统目录,可能因权限不足导致写入失败。

2. 用户环境不可控

管理员权限依赖

如果普通用户没有安装目录的写入权限(例如游戏安装在C:\Program Files),你的代码会因权限不足失败。

杀毒软件/系统保护

部分安全软件可能拦截对安装目录的写入操作,导致文件创建失败。

最好的办法还是将文件保存到Application.persistentDataPath

//使用 persistentDataPath 而非 streamingAssetsPathstring path = Path.Combine(Application.persistentDataPath, "Info.txt");if (File.Exists(path)){   File.Delete(path);}using (StreamWriter sr = new StreamWriter(path, false, Encoding.UTF8)){   sr.WriteLine("张三");}

Application.temporaryCachePath

Debug.Log(Application.temporaryCachePath);//可读写路径,存放临时文件(如下载的缓存文件)。//平台差异:系统可能自动清理此目录(如 iOS 低存储时)//Windows  C:/Users/[用户名]/AppData/Local/Temp/[公司名]/[游戏名]//macOS    /var/folders/xx/xxxxx/T/[公司名]/[游戏名]//Android   /data/data/[包名]/cache//iOS/var/mobile/Containers/Data/Application/[APP_UUID]/Library/Caches//WebGL    浏览器内存缓存(无持久化路径)可运用场景//临时下载文件、运行时生成的中间数据。//下载图片到临时缓存IEnumerator DownloadImage(string url) {   using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(url)) {       yield return request.SendWebRequest();       if (request.result == UnityWebRequest.Result.Success) {           Texture2D texture = DownloadHandlerTexture.GetContent(request);           byte[] bytes = texture.EncodeToPNG();           string tempPath = Path.Combine(Application.temporaryCachePath, "temp_image.png");           File.WriteAllBytes(tempPath, bytes);           Debug.Log("图片已保存到临时路径: " + tempPath);       }   }}

运行后,上述四个日志

路径对比与总结

persistentData Application.streamingAssetsPathPath

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OJeo-r7tqrpBC5tG0iA2ONoQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券