【问题标题】:Storage Client ListObjects存储客户端列表对象
【发布时间】:2019-11-22 23:49:15
【问题描述】:

我的应用程序需要从 Google 云存储桶下载文件。

我正在使用 StorageClient ListObjects 方法从 GCS 存储桶下载文件。

ListObjects 我想提供正则表达式格式的文件名。

目前我正在使用以下代码。

var listFiles = storageClientVariable.ListObjects(GCSBucketName, 
                folderPrefix).Where(p => Regex.IsMatch(p.Name, regexFileName));

foreach (var objectName in listFiles)
{
     bucketFileName = Path.GetFileName(objectName.Name);
     guidFolderPath = localPath + "\\" + bucketFileName;

     FileStream fs = new FileStream(guidFolderPath, FileMode.Create);
                     using (fs)
                     {
                        var progress = new Progress<IDownloadProgress>(
                          p => { DownloadProgress(p); });
                        storage.DownloadObject(GCSBucketName, objectName.Name, fs, option, progress);
                     }                     
}
break;

此代码运行良好。但是我在 Enumerable.Where 方法中传递了 regexFileName。它循环遍历存储桶中存在的所有文件。那么有没有其他方法可以避免额外的循环?或者有没有更好的方法使用 c# 代码从 GCS 存储桶下载文件?

【问题讨论】:

  • 在您看来还有什么“更好”的地方?该代码看起来可以工作,还是您收到任何错误消息?
  • @digijay 此代码工作正常。但是我在 Enumerable.Where 方法中传递了 regexFileName。它循环遍历存储桶中存在的所有文件。那么有没有其他方法可以避免额外的循环?
  • 啊,好吧,这更清楚了,虽然我不知道更好的方法来解决这个问题。您可能应该将该评论直接添加到问题中(使用编辑按钮)以供其他阅读此问题的人使用,这样它会更加清晰(和相关性)。 欢迎来到 StackOverflow!
  • 我建议删除double post,这里的人不赞成这个:-)

标签: c# google-cloud-storage


【解决方案1】:

正如@eespinola 所说,您可以在 ListObjects 请求中指定前缀。如果您的正则表达式恰好以非正则表达式特殊字符开头(即,除了“[”、“]”、“*”等),您可以为该部分构建前缀查询,然后使用正则表达式,就像你现在正在做的那样。 gsutil 像这样工作,例如,如果你这样做:

gsutil ls gs://my-bucket/abc[0-9]*

它将使用“abc”作为前缀,然后在客户端进行剩余的过滤。

【讨论】:

    【解决方案2】:

    您可以在documentation 中查看,使用官方 API,您可以列出 GCS 存储桶中的所有对象,或列出具有给定前缀的对象。但是,您不能使用 regexFilename 来优化您的代码。

    此外,您可以在 Github repository 中查看 C# 中的代码示例。

    我认为可以做到的唯一方法实际上和你现在做的一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多