code: func (d *driver) Delete(ctx context.Context, path string) error {
  	ossPath := d.ossPath(path)
  	listResponse, err := d.Bucket.List(ossPath, "", "", listMax)
  	if err != nil || len(listResponse.Contents) == 0 {
  		return storagedriver.PathNotFoundError{Path: path}
  	}
  
  	ossObjects := make([]oss.Object, listMax)
  
  	for len(listResponse.Contents) > 0 {
  		numOssObjects := len(listResponse.Contents)
  		for index, key := range listResponse.Contents {
  			// Stop if we encounter a key that is not a subpath (so that deleting "/a" does not delete "/ab").
  			if len(key.Key) > len(ossPath) && (key.Key)[len(ossPath)] != '/' {
  				numOssObjects = index
  				break
  			}
  			ossObjects[index].Key = key.Key
  		}
  
  		err := d.Bucket.DelMulti(oss.Delete{Quiet: false, Objects: ossObjects[0:numOssObjects]})
  		if err != nil {
  			return nil
  		}
  
  		if numOssObjects < len(listResponse.Contents) {
  			return nil
  		}
  
  		listResponse, err = d.Bucket.List(d.ossPath(path), "", "", listMax)
  		if err != nil {
  			return err
  		}
  	}
  
  	return nil
  }
docs: // Delete recursively deletes all objects stored at "path" and its subpaths.