func openWith()

in file.go [131:188]


func openWith(file vfs.File, opts Options) (*File, reason) {
	sz, ferr := file.Size()
	if ferr != nil {
		return nil, wrapErr(ferr)
	}

	isNew := false
	fileExists := sz > 0
	if !fileExists {
		if err := initNewFile(file, opts); err != nil {
			return nil, err
		}

		isNew = true
	}

	meta, metaActive, err := readValidMeta(file)
	if err != nil {
		return nil, err
	}

	pageSize := meta.pageSize.Get()

	maxSize := meta.maxSize.Get()
	if maxSize == 0 && opts.MaxSize > 0 {
		maxSize = opts.MaxSize
	}

	if maxSize > uint64(maxUint) {
		return nil, raiseInvalidParam("max file size to large for this system")
	}

	f, err := newFile(file, opts, metaActive, uint(maxSize), uint(pageSize))
	if err != nil {
		return nil, err
	}

	// Update the files MaxSize after the new file object has been created.
	// This allows us to handle the max size update like a transaction.
	if (!isNew && opts.Flags.check(FlagUpdMaxSize)) && opts.MaxSize != maxSize {
		ok := false
		defer cleanup.IfNot(&ok, cleanup.IgnoreError(f.Close))

		op := growFile
		if opts.MaxSize > 0 && opts.MaxSize < maxSize {
			op = shrinkFile
		}

		err := op(f, opts)
		if err != nil {
			return nil, err
		}

		ok = true
	}

	return f, nil
}