You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:34