Unity C#获取Firebase Storage文件夹元数据查找最新创建文件
解决Unity中Firebase Storage遍历文件夹并获取最新文件的问题
Firebase Storage的ListAll()方法确实仅支持Web平台,Unity SDK需要改用ListAsync()做分页遍历,同时通过GetMetadataAsync()获取文件创建时间戳来筛选最新文件,以下是可行实现方案:
完整实现代码
using System.Collections.Generic; using System.Linq; using Firebase.Storage; using UnityEngine; private StorageReference _storageRef; private void Start() { // 初始化Storage根引用 _storageRef = FirebaseStorage.DefaultInstance.RootReference; // 调用方法查找目标文件 FindLatestFileStartingWithA(".csv"); } private async void FindLatestFileStartingWithA(string extension) { StorageReference folderRef = _storageRef.Child("csv_folder"); // 存储符合条件的文件引用+创建时间戳 List<(StorageReference fileRef, long creationTime)> candidateFiles = new List<(StorageReference, long)>(); try { // 分页遍历文件夹(Firebase单次查询最多返回1000条结果) StorageListResult listResult; string pageToken = null; do { listResult = await folderRef.ListAsync(pageToken); foreach (StorageReference fileRef in listResult.Items) { string fileName = fileRef.Name; // 筛选以"A"开头、指定后缀的文件 if (fileName.StartsWith("A") && fileName.EndsWith(extension)) { // 获取文件元数据,提取创建时间戳 var metadata = await fileRef.GetMetadataAsync(); long creationTime = metadata.CreationTimeMillis; candidateFiles.Add((fileRef, creationTime)); } } // 更新分页令牌,处理下一页数据 pageToken = listResult.PageToken; } while (!string.IsNullOrEmpty(pageToken)); // 按创建时间倒序排序,取第一个即为最新文件 if (candidateFiles.Any()) { var latestFile = candidateFiles.OrderByDescending(item => item.creationTime).First(); Debug.Log($"最新目标文件: {latestFile.fileRef.Name},创建时间戳: {latestFile.creationTime}"); // 启动下载流程 StartCoroutine(DownloadCSV(latestFile.fileRef.Name)); } else { Debug.Log("未找到符合条件的文件"); } } catch (System.Exception e) { Debug.LogError($"遍历文件出错: {e.Message}"); } } // 示例下载协程(替换为你的实际下载逻辑) private IEnumerator DownloadCSV(string fileName) { // 你的文件下载实现 yield return null; }
关键说明
- 分页处理:
ListAsync()通过PageToken支持分页查询,适配文件夹内文件数量超过1000的场景 - 准确排序:依赖元数据的
CreationTimeMillis(从1970年起的毫秒数)排序,比按文件名排序更可靠 - 性能优化建议:如果文件夹文件数量较多,建议在上传文件时将创建时间同步存入Firebase Realtime Database或Firestore,直接从数据库查询最新文件,避免遍历所有文件的开销
内容的提问来源于stack exchange,提问作者thisisKushagr
相关产品推荐
相关产品推荐

