Unity开发Android应用访问PC本地文件遇FileNotFoundException求助
Android设备无法访问Windows本地文件的问题解决
核心错误原因
Android设备是独立的操作系统,拥有自身的文件系统,完全无法直接访问Windows电脑的本地文件路径(比如C:\Users\LIA\Documents\wat.txt)。你遇到的FileNotFoundException本质是Android设备的文件系统中根本不存在该路径,和Unity权限设置无关,管理员身份运行Unity也无法解决这个问题。
解决步骤
1. 将文件转移到Android可访问的位置
你需要把目标文件放到Android设备能读取的路径中,常见方案有两种:
- 方案一:复制到Android设备存储
将wat.txt复制到Android设备的内部存储(比如Documents文件夹),使用Android的文件路径访问,示例:string filePath = Path.Combine(Application.persistentDataPath, "wat.txt"); // 也可直接指定内部存储绝对路径:/storage/emulated/0/Documents/wat.txt - 方案二:放入Unity StreamingAssets目录
将文件放到Unity项目的Assets/StreamingAssets文件夹下,打包后通过Application.streamingAssetsPath访问,示例:string filePath = Path.Combine(Application.streamingAssetsPath, "wat.txt");
2. 修正上传代码的错误
你的代码中uploadRef.PutFileAsync(stream.ToString())存在严重问题:Stream.ToString()不会返回文件路径,只会返回流的类型名称(比如System.IO.FileStream),这会导致Firebase无法定位正确文件。你需要:
- 若使用文件路径上传,直接传入路径字符串:
uploadRef.PutFileAsync(filePath).ContinueWithOnMainThread(task => { // 后续处理逻辑 }); - 若使用已打开的流上传,改用
PutStreamAsync方法:using (var stream = File.Open(filePath, FileMode.Open)) { uploadRef.PutStreamAsync(stream).ContinueWithOnMainThread(task => { // 后续处理逻辑 }); }
完整修正代码示例
// 假设文件放在Android设备的persistentDataPath目录下 string filePath = Path.Combine(Application.persistentDataPath, "wat.txt"); // 先检查文件是否存在 if (File.Exists(filePath)) { using (var stream = File.Open(filePath, FileMode.Open)) { // Firebase Storage 初始化 var storage = FirebaseStorage.DefaultInstance; var storageReference = storage.GetReferenceFromUrl("gs://houdini-ac884.appspot.com"); // 上传文件 StorageReference uploadRef = storageReference.Child("uploads/newFile.meta"); Debug.Log("Beginning Upload;;"); uploadRef.PutStreamAsync(stream).ContinueWithOnMainThread((task) => { if(task.IsFaulted || task.IsCanceled){ Debug.Log("Upload Failed with following error:"); Debug.Log(task.Exception.ToString()); }else{ Debug.Log("File Uploaded with success"); } }); } } else { Debug.LogError("File not found at path: " + filePath); }
内容的提问来源于stack exchange,提问作者EvocativeAxis
相关产品推荐
相关产品推荐

