Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

FileAccess

继承: RefCounted < Object

提供用于文件读写操作的方法。

描述

这个类可以用于在用户设备的文件系统中永久存储数据,也可以从中读取数据。适用于存储游戏存档数据或玩家配置文件。

下面是一个关于如何写入和读取文件的示例:

func save_to_file(content):
    var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE)
    file.store_string(content)

func load_from_file():
    var file = FileAccess.open("user://save_game.dat", FileAccess.READ)
    var content = file.get_as_text()
    return content

在上面的例子中,文件将被保存在数据路径文件中指定的用户数据文件夹中。

FileAccess 会在释放时关闭,超出作用于、赋值为 null 等情况都会导致释放。可以使用 close 在此之前显式关闭。在 C# 中,引用必须手动释放,可以通过 using 语句或直接调用 Dispose 方法来完成。

注意:要在导出后访问项目资源,建议使用 ResourceLoader 而不是 FileAccess,因为有些文件已被转换为特定于引擎的格式,并且它们的原始源文件可能并不存在于导出的 PCK 包中。

注意:只有当进程“正常”退出时(例如通过单击窗口管理器的关闭按钮或按 Alt + F4),文件才会自动关闭。如果在项目运行时按 F8 停止项目执行,则不会关闭文件,因为游戏进程将被杀死。可以通过定期调用 flush 来解决这个问题。

教程

属性

bool

big_endian

方法

void

close()

bool

eof_reached() const

bool

file_exists(path: String) static

void

flush()

int

get_8() const

int

get_16() const

int

get_32() const

int

get_64() const

String

get_as_text(skip_cr: bool = false) const

PackedByteArray

get_buffer(length: int) const

PackedStringArray

get_csv_line(delim: String = ",") const

float

get_double() const

Error

get_error() const

PackedByteArray

get_file_as_bytes(path: String) static

String

get_file_as_string(path: String) static

float

get_float() const

bool

get_hidden_attribute(file: String) static

int

get_length() const

String

get_line() const

String

get_md5(path: String) static

int

get_modified_time(file: String) static

Error

get_open_error() static

String

get_pascal_string()

String

get_path() const

String

get_path_absolute() const

int

get_position() const

bool

get_read_only_attribute(file: String) static

float

get_real() const

String

get_sha256(path: String) static

BitField[UnixPermissionFlags]

get_unix_permissions(file: String) static

Variant

get_var(allow_objects: bool = false) const

bool

is_open() const

FileAccess

open(path: String, flags: ModeFlags) static

FileAccess

open_compressed(path: String, mode_flags: ModeFlags, compression_mode: CompressionMode = 0) static

FileAccess

open_encrypted(path: String, mode_flags: ModeFlags, key: PackedByteArray) static

FileAccess

open_encrypted_with_pass(path: String, mode_flags: ModeFlags, pass: String) static

Error

resize(length: int)

void

seek(position: int)

void

seek_end(position: int = 0)

Error

set_hidden_attribute(file: String, hidden: bool) static

Error

set_read_only_attribute(file: String, ro: bool) static

Error

set_unix_permissions(file: String, permissions: BitField[UnixPermissionFlags]) static

void

store_8(value: int)

void

store_16(value: int)

void

store_32(value: int)

void

store_64(value: int)

void

store_buffer(buffer: PackedByteArray)

void

store_csv_line(values: PackedStringArray, delim: String = ",")

void

store_double(value: float)

void

store_float(value: float)

void

store_line(line: String)

void

store_pascal_string(string: String)

void

store_real(value: float)

void

store_string(string: String)

void

store_var(value: Variant, full_objects: bool = false)


枚举

enum ModeFlags: 🔗

ModeFlags READ = 1

打开文件进行读取操作。光标位于文件的开头。

ModeFlags WRITE = 2

打开文件进行写操作。如果文件不存在则会创建该文件,如果存在则会截断。

注意:创建文件必须在已有目录中执行。如果要递归创建文件路径中的目录,见 DirAccess.make_dir_recursive

ModeFlags READ_WRITE = 3

打开文件用于读写操作。不截断文件。光标位于文件的开头。

ModeFlags WRITE_READ = 7

打开文件进行读写操作。如果文件不存在则会创建该文件,如果存在则会截断。光标位于文件的开头。

注意:创建文件必须在已有目录中执行。如果要递归创建文件路径中的目录,见 DirAccess.make_dir_recursive


enum CompressionMode: 🔗

CompressionMode COMPRESSION_FASTLZ = 0

使用 FastLZ 压缩方法。

CompressionMode COMPRESSION_DEFLATE = 1

使用 DEFLATE 压缩方法。

CompressionMode COMPRESSION_ZSTD = 2

使用 Zstandard 压缩方法。

CompressionMode COMPRESSION_GZIP = 3

使用 gzip 压缩方法。

CompressionMode COMPRESSION_BROTLI = 4

使用 brotli 压缩方法(仅支持解压缩)。


flags UnixPermissionFlags: 🔗

UnixPermissionFlags UNIX_READ_OWNER = 256

读取所有者比特位。

UnixPermissionFlags UNIX_WRITE_OWNER = 128

写入所有者比特位。

UnixPermissionFlags UNIX_EXECUTE_OWNER = 64

执行所有者比特位。

UnixPermissionFlags UNIX_READ_GROUP = 32

读取组比特位。

UnixPermissionFlags UNIX_WRITE_GROUP = 16

写入组比特位。

UnixPermissionFlags UNIX_EXECUTE_GROUP = 8

执行组比特位。

UnixPermissionFlags UNIX_READ_OTHER = 4

读取其他比特位。

UnixPermissionFlags UNIX_WRITE_OTHER = 2

写入其他比特位。

UnixPermissionFlags UNIX_EXECUTE_OTHER = 1

执行其他比特位。

UnixPermissionFlags UNIX_SET_USER_ID = 2048

在执行比特位上设置用户 ID 。

UnixPermissionFlags UNIX_SET_GROUP_ID = 1024

在执行位上设置组 ID。

UnixPermissionFlags UNIX_RESTRICTED_DELETE = 512

限制删除(粘性)比特位。


属性说明

bool big_endian 🔗

  • void set_big_endian(value: bool)

  • bool is_big_endian()

如果为 true,则文件用大端字节序读取。如果为 false,则文件以小端字节序读取。如果有疑问,请将其保留为 false,因为大多数文件都是用小端字节序编写的。

注意:big_endian 只与文件格式有关,与 CPU 类型无关。CPU 字节序不会影响写入文件的默认字节序。

注意:每当打开文件时,该选项总是被重置为 false。因此,必须在打开文件之后设置 big_endian,而不是之前。


方法说明

void close() 🔗

关闭当前打开的文件,阻止后续的读写操作。如果要将数据持久化到磁盘而不关闭文件,请使用 flush

注意:FileAccess 被释放时会自动关闭,释放发生在离开作用域或被赋值为 null 时。在 C# 中,使用完后必须弃置该引用,可以使用 using 语句或直接调用 Dispose 方法。


bool eof_reached() const 🔗

如果文件光标已经读到了文件末尾,则返回 true

注意:eof_reached() == false 不能用于检查是否有更多可用数据。要在有更多可用数据时循环,请使用:

while file.get_position() < file.get_length():
    # 读取数据

bool file_exists(path: String) static 🔗

如果文件存在于给定路径中,则返回 true

注意:许多资源类型是导入的(例如纹理或声音文件),它们的源资产不会包含在导出的游戏中,因为只使用导入的版本。有关考虑资源重新映射的替代方法,请参阅 ResourceLoader.exists

对于非静态的相对等效项,请使用 DirAccess.file_exists


void flush() 🔗

将文件的缓冲区写入磁盘。当关闭文件时,会自动进行刷新。这意味着你不需要在关闭文件前手动调用 flush。尽管如此,即使项目崩溃而不是正常关闭,调用 flush 仍可用于确保数据安全。

注意:只有在你真正需要的时候才调用 flush。否则,它会因不断的磁盘写入而降低性能。


int get_8() const 🔗

以整数形式返回文件中接下来的 8 位。请参阅 store_8,详细了解哪些值可以通过这种方式存储和检索。


int get_16() const 🔗

以整数形式返回文件中接下来的 16 位。请参阅 store_16,以获取有关可以通过这种方式存储和检索哪些值的详细信息。


int get_32() const 🔗

以整数形式返回文件中接下来的 32 位。请参阅store_32,以获取有关可以通过这种方式存储和检索哪些值的详细信息。


int get_64() const 🔗

以整数形式返回文件中接下来的 64 位。请参阅 store_64,以获取有关可以通过这种方式存储和检索哪些值的详细信息。


String get_as_text(skip_cr: bool = false) const 🔗

String 形式返回整个文件。文本会按照 UTF-8 编码解析。

如果 skip_crtrue,解析 UTF-8 时会忽略回车符(\r,CR),因此只使用换行符(\n,LF)表示新一行的开始(Unix 规范)。


PackedByteArray get_buffer(length: int) const 🔗

将文件中接下来的 length 个字节作为 PackedByteArray 返回。


PackedStringArray get_csv_line(delim: String = ",") const 🔗

以 CSV(逗号分隔值)格式返回文件的下一个值。可以传递不同的分隔符 delim,以使用默认 ","(逗号)以外的其他分隔符。这个分隔符必须为一个字符长,且不能是双引号。

文本被解析为 UTF-8 编码。如果文本值包含分隔符,则它们必须用双引号引起来。文本值中的双引号可以通过将它们的出现次数加倍来转义。

例如,以下 CSV 行是有效的,每行将被正确解析为两个字符串:

Alice,"Hello, Bob!"
Bob,Alice! What a surprise!
Alice,"I thought you'd reply with ""Hello, world""."

请注意第二行如何省略封闭的引号,因为它不包含分隔符。然而它可以很好地使用引号,它只是为了演示目的而没有编写。第三行必须为每个需要被解析为引号而不是文本值的末尾而使用 ""


float get_double() const 🔗

将文件中接下来的 64 位作为浮点数返回。


Error get_error() const 🔗

返回试图执行操作时发生的最后一个错误。请与 Error 中的 ERR_FILE_* 常量比较。


PackedByteArray get_file_as_bytes(path: String) static 🔗

将整个 path 文件内容作为 PackedByteArray 返回,无需任何解码。

如果打开文件时发生错误,则返回空的 PackedByteArray。你可以使用