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

在上述示例中,文件将按照Data paths文档中指定的路径保存在用户数据文件夹中。当文件超出作用域或被赋值为null时,FileAccess将被关闭。close()可用于在此之前显式关闭它。在C#中,必须手动释放引用,可以使用using语句或直接调用Dispose方法来实现。

注意:一旦导出项目资源,建议使用ResourceLoader而不是FileAccess,因为有些文件被转换为引擎特定的格式,其原始源文件可能不在导出的PCK包中。如果使用FileAccess,请确保文件被包含在导出中,方法是在导入面板中将其导入模式更改为保留文件(原样导出),或者对于没有此选项的文件,在导出对话框中更改非资源导出过滤器以包含文件的扩展名(例如*.txt)。

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

属性

方法

void

close()

FileAccess

create_temp(mode_flags: int, prefix: String = "", extension: String = "", keep: bool = false) static

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

float

get_half() 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, iv: PackedByteArray = 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

bool

store_8(value: int)

bool

store_16(value: int)

bool

store_32(value: int)

bool

store_64(value: int)

bool

store_buffer(buffer: PackedByteArray)

bool

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

bool

store_double(value: float)

bool

store_float(value: float)

bool

store_half(value: float)

bool

store_line(line: String)

bool

store_pascal_string(string: String)

bool

store_real(value: float)

bool

store_string(string: String)

bool

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,则使用big-endianendianness读取文件。如果false,则使用little-endian endianness读取文件。如果有疑问,请将其留给false,因为大多数文件都是使用little-endian endianness编写的。

注意:big_endian只是关于文件格式,而不是CPU类型。CPU顺序不会影响写入文件的默认顺序。

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


方法说明

void close() 🔗

关闭当前打开的文件并阻止后续的读/写操作。使用flush()将数据持久化到磁盘而不关闭文件。

注意:FileAccess将在释放时自动关闭,当它超出范围或被分配null时会发生这种情况。在C#中,引用必须在我们使用它之后进行处理,这可以使用使用语句或直接调用Dispose方法来完成。


FileAccess create_temp(mode_flags: int, prefix: String = "", extension: String = "", keep: bool = false) static 🔗

创建一个临时文件。当返回的FileAccess被释放时,该文件将被释放。

如果prefix不为空,它将以文件名为前缀,用-分隔。

如果extension不为空,它将附加到临时文件名中。

如果keeptrue,则释放返回的FileAccess时不会删除文件。

如果打开文件失败,则返回null。您可以使用get_open_error()检查发生的错误。


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 🔗

PackedByteArray的形式返回文件的下一个length字节。


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。您可以使用get_open_error()检查发生的错误。


String get_file_as_string(path: String) static 🔗

String形式返回整个path文件内容。文本被解释为UTF-8编码。

如果打开文件时发生错误,则返回空String。您可以使用get_open_error()检查发生的错误。


float get_float() const 🔗

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


float get_half() const 🔗

将文件中接下来的16位作为半精度浮点数返回。


bool get_hidden_attribute(file: String) static 🔗

如果设置了文件隐藏属性,则返回true

注意:此方法在iOS、BSD、macOS和Windows上实现。


int get_length() const 🔗

以字节为单位返回文件的大小。对于管道,返回可从管道读取的字节数。


String get_line() const 🔗

String形式返回文件的下一行。返回的字符串不包含换行符(\n)或回车符(\r)字符,但包含任何其他开头或结尾空白字符。

文本被视为UTF-8编码。


String get_md5(path: String) static 🔗

返回一个MD5字符串,表示给定路径处的文件,或在失败时返回一个空的String


int get_modified_time(file: String) static 🔗

返回上次以Unix时间戳格式修改file的时间,或错误时返回0。此Unix时间戳可以使用Time单例转换为另一种格式。


Error get_open_error() static 🔗

返回当前线程中最后一次open()调用的结果。


String get_pascal_string() 🔗

从文件中返回以Pascal格式保存的String

文本被解释为UTF-8编码。


String get_path() const 🔗

String形式返回当前打开文件的路径。


String get_path_absolute() const 🔗

String形式返回当前打开文件的绝对路径。


int get_position() const 🔗

返回文件光标的位置。


bool get_read_only_attribute(file: String) static 🔗

如果设置了file只读属性,则返回true

注意:此方法在iOS、BSD、macOS和Windows上实现。


float get_real() const 🔗

将文件中的下一位作为浮点数返回。


String get_sha256(path: String) static 🔗

返回表示给定路径处文件的SHA-256String或失败时返回空String


BitField[UnixPermissionFlags] get_unix_permissions(file: String) static 🔗

返回文件UNIX权限。

注意:此方法在iOS、Linux/BSD和macOS上实现。


Variant get_var(allow_objects: bool = false) const 🔗

返回文件中的下一个Variant值。如果allow_objectstrue,则允许解码对象。

在内部,这使用与@GlobalScope.bytes_to_var()方法相同的解码机制。

警告:反序列化对象可能包含被执行的代码。如果序列化对象来自不受信任的来源,请不要使用此选项以避免潜在的安全威胁,例如远程代码执行。


bool is_open() const 🔗

如果文件当前打开,则返回true


FileAccess open(path: String, flags: ModeFlags) static 🔗

创建一个新的FileAccess对象并打开文件以进行写入或读取,具体取决于标志。

如果打开文件失败,则返回null。您可以使用get_open_error()检查发生的错误。


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

创建一个新的FileAccess对象并打开一个压缩文件以进行读取或写入。

注意:open_compressed()只能读取由i3D保存的文件,不能读取第三方压缩格式。有关解决方法,请参阅GitHub问题#28999

如果打开文件失败,则返回null。您可以使用get_open_error()检查发生的错误。


FileAccess open_encrypted(path: String, mode_flags: ModeFlags, key: PackedByteArray, iv: PackedByteArray = PackedByteArray()) static 🔗

创建一个新的FileAccess对象并以写入或读取模式打开一个加密文件。您需要传递一个二进制密钥来加密/解密它。

注意:提供的密钥必须为32字节长。

如果打开文件失败,则返回null。您可以使用get_open_error()检查发生的错误。


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

创建一个新的FileAccess对象并以写入或读取模式打开一个加密文件。您需要传递密码才能加密/解密它。

如果打开文件失败,则返回null。您可以使用get_open_error()检查发生的错误。


Error resize(length: int) 🔗

将文件调整为指定的长度。文件必须以允许写入的模式打开。如果文件被扩展,则附加NUL字符。如果文件被截断,则从结束文件到文件原始长度的所有数据都将丢失。


void seek(position: int) 🔗

将文件读/写光标更改到指定位置(以文件开头的字节为单位)。


void seek_end(position: int = 0) 🔗

将文件读/写光标更改到指定位置(以文件末尾的字节为单位)。

注意:这是一个偏移量,因此您应该使用负数,否则光标将位于文件末尾。


Error set_hidden_attribute(file: String, hidden: bool) static 🔗

设置文件隐藏属性。

注意:此方法在iOS、BSD、macOS和Windows上实现。


Error set_read_only_attribute(file: String, ro: bool) static 🔗

设置文件只读属性。

注意:此方法在iOS、BSD、macOS和Windows上实现。


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

设置文件UNIX权限。

注意:此方法在iOS、Linux/BSD和macOS上实现。


bool store_8(value: int) 🔗

将整数存储为文件中的8位。

注意:value应该位于区间[0,255]中。任何其他值都会溢出并环绕。

注意:如果发生错误,则文件位置指示符的结果值不确定。

要存储有符号整数,请使用store_64(),或手动转换它(有关示例,请参阅store_16())。


bool store_16(value: int) 🔗

将一个整数以16位的形式存储在文件中.

注意: value 应在[0, 2^16 - 1]范围内。任何其他值都将溢出并循环使用。

注意:如果发生错误,则文件位置指示器的结果值是不确定的。

要存储有符号整数,请使用store_64()或存储来自[-2^15, 2^15 - 1]范围的有符号整数(即保留一个位用于符号),并在读取时手动计算其符号。例如:

const MAX_15B = 1 << 15
const MAX_16B = 1 << 16

func unsigned16_to_signed(unsigned):
    return (unsigned + MAX_15B) % MAX_16B - MAX_15B

func _ready():
    var f = FileAccess.open("user://file.dat", FileAccess.WRITE_READ)
    f.store_16(-42) # 环绕存储 65494 (2^16 - 42).
    f.store_16(121) # 在有效范围内,容量为 121 。
    f.seek(0) # 回到起始位置,重新读取存储的值。
    var read1 = f.get_16() # 65494
    var read2 = f.get_16() # 121
    var converted1 = unsigned16_to_signed(read1) # -42
    var converted2 = unsigned16_to_signed(read2) # 121

bool store_32(value: int) 🔗

将整数存储为文件中的32位。

注意:value应该位于区间[0,2^32-1]中。任何其他值都会溢出并环绕。

注意:如果发生错误,则文件位置指示符的结果值不确定。

要存储有符号整数,请使用store_64(),或手动转换它(有关示例,请参阅store_16())。


bool store_64(value: int) 🔗

将整数存储为文件中的64位。

注意:value必须位于区间[-2^63,2^63-1](即为有效的int值)。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_buffer(buffer: PackedByteArray) 🔗

将给定的字节数组存储在文件中。

注意:如果发生错误,则文件位置指示符的结果值不确定。


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

将给定的PackedStringArray存储在文件中,作为CSV(逗号分隔值)格式的行。您可以传递不同的分隔符delim来使用,而不是默认的","(逗号)。此分隔符必须为一个字符长。

文本将被编码为UTF-8。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_double(value: float) 🔗

将浮点数存储为文件中的64位。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_float(value: float) 🔗

将浮点数存储为文件中的32位。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_half(value: float) 🔗

将半精度浮点数存储为文件中的16位。


bool store_line(line: String) 🔗

line存储到文件中,后接一个换行符(\n),使用UTF-8编码。

注意:如果发生错误,文件位置指示器的值是不确定的。


bool store_pascal_string(string: String) 🔗

将给定的String以Pascal格式存储为文件中的一行(即还存储字符串的长度)。

文本将被编码为UTF-8。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_real(value: float) 🔗

在文件中存储浮点数。

注意:如果发生错误,则文件位置指示符的结果值不确定。


bool store_string(string: String) 🔗

string存储到文件中,不使用换行符(\n),使用UTF-8编码。

注意:此方法旨在用于编写文本文件。字符串以UTF-8编码的缓冲区形式存储,没有字符串长度或结尾的零,这意味着无法轻松加载回来。如果要在二进制文件中存储可检索的字符串,请考虑使用store_pascal_string()代替。若要从文本文件中检索字符串,您可以使用get_buffer(length).get_string_from_utf8()(如果您知道长度)或get_as_text()

注意:如果发生错误,文件位置指示器的结果值是不确定的。


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

在文件中存储任何Variant值。如果full_objectstrue,则允许编码对象(并且可能包含代码)。

在内部,这使用与@GlobalScope.var_to_bytes()方法相同的编码机制。

注意:并非所有属性都包括在内。只有使用@GlobalScope.PROPERTY_USAGE_STORAGE标志集配置的属性才会被序列化。您可以通过覆盖类中的Object._get_property_list()方法向属性添加新的使用标志。您还可以通过调用Object._get_property_list()检查属性使用是如何配置的。有关可能的使用标志,请参阅PropertyUsageFlags

注意:如果发生错误,则文件位置指示符的结果值不确定。