juicedata / juicesync

A tool to move your data between any clouds or regions.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

$ 符号结尾问题

SecretSun opened this issue · comments

object/s3.go

func (s *s3client) List(prefix, marker string, limit int64) ([]*Object, error) {
	param := s3.ListObjectsInput{
		Bucket:  &s.bucket,
		Prefix:  &prefix,
		Marker:  &marker,
		MaxKeys: &limit,
	}
	resp, err := s.s3.ListObjects(&param)
	if err != nil {
		return nil, err
	}
	n := len(resp.Contents)

	objs := make([]*Object, 0)
	for i := 0; i < n; i++ {
		o := resp.Contents[i]
		if strings.HasSuffix(*o.Key, "$") {
			logger.Infof("s3 path: %s was empty dir, skip it!", *o.Key)
			continue
		}
		mtime := int(o.LastModified.Unix())
		objs = append(objs, &Object{*o.Key, *o.Size, mtime, mtime})
	}

	/*
		objs := make([]*Object, n)
		for i := 0; i < n; i++ {
			o := resp.Contents[i]
			mtime := int(o.LastModified.Unix())
			objs[i] = &Object{*o.Key, *o.Size, mtime, mtime}
		}
	*/
	return objs, nil
}
commented

这个是说用 $ 来标记一个 key 是一个文件夹么? 额这是一个通用做法么?
还是说现在大家都直接用 path/to/dir/ 这种 / 结尾的 key 做 folder 的...

Rclone 上也有类似讨论: rclone/rclone#753

@SecretSun 是不是 这些 $ 结尾的文件的大小也是 0?

Fixed by #29

Rclone 上也有类似讨论: rclone/rclone#753

@SecretSun 是不是 这些 $ 结尾的文件的大小也是 0?

不是的,就是 $ 符号结尾,文件大小为0 我们公司从场景下,文件都是要的,还是建议都传输比较好

  if strings.HasSuffix(*o.Key, "$") {
  	logger.Infof("s3 path: %s was empty dir, skip it!", *o.Key)
  	continue
  }

这段是建议的修改吗?如果 $ 符号结尾是普通文件,为什么要跳过呢?是 / 的笔误吗?或者你提个完整的 PR 上来方便 review? @SecretSun

预期的行为应该是对于文件系统里的空目录,在对象存储上创建 / 结尾并且大小为 0 的对象,对象存储之间同步的时候需要同步创建这样的对象,对吗?

#29 里直接跳过了,没有实现这个过程吧?需要跳过的是遍历过程。不知道我的理解对不对。

commented

@yujunz 我的理解是他们用 $ 作为 folder 的标识, 不过现在其实 s3 都支持 / 作为 folder 标识了...

After #35 , all the keys will be copied.