【发布时间】:2014-05-23 00:02:29
【问题描述】:
在写入 GCS 文件之前,我想测试它是否存在。但是,我从file.Stat 收到一个错误,它在os.IsNotExist 中返回false,并且我在appengine/file 或appengine 中看不到任何可以测试的导出错误。从 App Engine 确定 GCS 中不存在文件的最佳方法是什么?
我也可能以完全错误的方式执行此操作,并且还有其他方法可以确保我不会覆盖或附加到现有文件。如果有的话,我也很想听听。
我的复制代码:
package main
import (
"net/http"
"fmt"
"appengine"
"appengine/file"
)
func init() {
http.HandleFunc("/test", reproduceHandler)
}
func reproduceHandler(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
// You'll need your own bucket name here
_, err := file.Stat(c, "/gs/my-bucket-name/my-file-name")
fmt.Fprintln(w, err)
}
当我访问“/test”时显示如下:
API error 100 (file: EXISTENCE_ERROR)
【问题讨论】:
-
文档没有说太多。如果文件存在与否,Stat 应该返回。
-
Stat 返回一个
os.FileInfo和一个error。在这种情况下,os.FileInfo是<nil>,error与我的问题一样。诀窍是消除该错误与 Stat 可能返回的任何其他错误的歧义。 -
看源码:code.google.com/p/appengine-go/source/browse/appengine/file/… 貌似文件不存在总是会失败,因为实现的开放限制。如果文件存在,那么它将能够返回一个统计对象。
-
但是如果文件存在,但是由于其他原因打开失败怎么办?看起来在这种情况下,Stat 将返回
nil, err,因此设置err不足以说明该文件不存在。 -
你想达到什么目的?使用Object Preconditions 可能会更好。例如,将
if-generation-match设置为 0 只会在对象不存在时写入。
标签: google-app-engine go google-cloud-storage