public static function createFile(
        string $name,
        int $maxAttempts = 10
    ): entity\FileEntity
    {
        $tmpdir = static::getDir();
        $name = \sndsgd\Fs::sanitizeName($name);
        $pos = strrpos($name, ".");
        if ($pos === false) {
            $extension = "";
        } else {
            $extension = substr($name, $pos);
            $name = substr($name, 0, $pos);
        }

        $attempts = 1;
        do {
            if ($attempts > $maxAttempts) {
                throw new \RuntimeException(
                    "failed to create temp file; ".
                    "reached max number ($maxAttempts) of attempts"
                );
            }
            $rand = \sndsgd\Str::random(10);
            $path = "$tmpdir/$name-$rand$extension";
            $attempts++;
        }
        while (file_exists($path));
        touch($path);
        $file = new entity\FileEntity($path);
        static::registerEntity($file);
        return $file;
    }