Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud storage 测试桶中是否存在对象?_Google Cloud Storage_Google App Engine - Fatal编程技术网

Google cloud storage 测试桶中是否存在对象?

Google cloud storage 测试桶中是否存在对象?,google-cloud-storage,google-app-engine,Google Cloud Storage,Google App Engine,我试图找出在谷歌云存储中测试存储桶中对象是否存在的最有效方法 这就是我现在正在做的: 试试看 { final GcsFileMetadata md=GCS_SERVICE.getMetadata(bm.getFilename()); if(md==null) { //做我该做的! } } 捕获(IOE异常) { L.错误(如getMessage()); } 因为根据文档,如果GcsFilename不存在,它将返回null 在存储桶上使用.list()并检查.contains()听起来很昂贵,

我试图找出在谷歌云存储中测试
存储桶中
对象是否存在的最有效方法

这就是我现在正在做的:

试试看
{
final GcsFileMetadata md=GCS_SERVICE.getMetadata(bm.getFilename());
if(md==null)
{
//做我该做的!
}
}
捕获(IOE异常)
{
L.错误(如getMessage());
}
因为根据文档,如果
GcsFilename
不存在,它将返回
null

存储桶上使用
.list()
并检查
.contains()
听起来很昂贵,但其目的是明确的

就我个人而言,我认为测试
null
以检查是否存在某些东西是不雅观的,不像
GCS\u服务那样直接但我想我没有机会设计GCS客户端API。我将在我的API中创建一个方法来进行此测试

是否有一种更有效(如及时)或更自我记录的方法来进行此测试?解决方案 以下是我最终得出的工作解决方案:
@Nonnull
受保护类getEntityType(){(类)新类型令牌(getClass()){}.getRawType();}
/**
*清除GCS中不再有匹配对象的ObjectMetadata记录。
*/
公共无效Purgorphans()
{
ofy().transact(新工作())
{
@凌驾
公共工程运行()
{
尝试
{
对于(最终的T bm:ofy().load().type(ObjectMetadataEntityService.this.getEntityType()).iterable())
{
final GcsFileMetadata md=GCS_SERVICE.getMetadata(bm.getFilename());
if(md==null)
{
ofy().delete().entity(bm);
}
}
}
捕获(IOE异常)
{
L.错误(如getMessage());
}
返回null;
}
});
}

他们添加了
文件.exists()
方法

const fileExists = _=>{
    return file.exists().then((data)=>{ console.log(data[0]); });
}

fileExists();
//logs a boolean to the console;
//true if the file exists;
//false if the file doesn't exist.

不,我认为你所做的是正确的。它应该向服务器发出HEAD请求。
@Nonnull
protected Class<T> getEntityType() { (Class<T>) new TypeToken<T>(getClass()) {}.getRawType(); }

/**
 * purge ObjectMetadata records that don't have matching Objects in the GCS anymore.
 */
public void purgeOrphans()
{
    ofy().transact(new Work<VoidWork>()
    {
        @Override
        public VoidWork run()
        {
            try
            {
                for (final T bm : ofy().load().type(ObjectMetadataEntityService.this.getEntityType()).iterable())
                {
                    final GcsFileMetadata md = GCS_SERVICE.getMetadata(bm.getFilename());
                    if (md == null)
                    {
                        ofy().delete().entity(bm);
                    }
                }
            }
            catch (IOException e)
            {
                L.error(e.getMessage());
            }
            return null;
        }
    });
}
const fileExists = _=>{
    return file.exists().then((data)=>{ console.log(data[0]); });
}

fileExists();
//logs a boolean to the console;
//true if the file exists;
//false if the file doesn't exist.