发现了一个FileAccess类一个很奇葩的BUG
godot吧
全部回复
仅看楼主
level 8
旋转的刀 楼主
用 FileAccess.WRITE 模式开文件就不会追加写入,不管有没有 seek_end ,不管是用 store_string 写入还是用 store_line写入。
换成 FileAccess.READ_WRITE 模式打开文件就没问题,但是 FileAccess.READ_WRITE 又存在一个问题,在文件不存在时又不会自动创建,返回错误码是7(文件不存在),可是文档上明明写的会自动创建,简直吐血了。
各位兄弟们有没有遇到同样的情况呢?我现在用了一段极丑陋代码来解决的,太难看了。
# 这里有BUG,用 FileAccess.WRITE 模式开文件就不会追加写入,用 FileAccess.READ_WRITE 就没问题,但是 FileAccess.READ_WRITE 在文件不存在时又不会创建,吐血了
var file = FileAccess.open(log_file_path, FileAccess.READ_WRITE)
if not file:
printerr(FileAccess.get_open_error())
printerr("用读_写模式开日志文件失败,可能是日志文件不存在.")
file = FileAccess.open(log_file_path, FileAccess.WRITE) # 尝试用 FileAccess.WRITE 模式打开一次,创建文件
if not file:
printerr("用只写模式打开日志文件也失败.")
return
else: # 如果打开成功了,就把文件关掉,再用读写模式打开一次,以便可以追加写入
file.close()
file = FileAccess.open(log_file_path, FileAccess.READ_WRITE)
if not file:
printerr("再次尝试用读_写模式开日志文件失败.")
return
file.seek_end()
file.store_string(log_entry)
file.flush()
2025年01月28日 21点01分 1
吧务
level 13
1这个问题你看错文档了吧
“但是 FileAccess.READ_WRITE 又存在一个问题,在文件不存在时又不会自动创建,返回错误码是7(文件不存在),可是文档上明明写的会自动创建,简直吐血了”
这个自动创建指的是 WRITE_READ而不是READ_WRITE,另外这个创建文件也只保证文件所在的目录是存在时,才能成功
2 store_string 和 store_line 追加写入是文档错误,保留了版本3的注释,4.4已经更新了,要想追加需要先seek_end将光标移到文件末尾
2025年01月29日 01点01分 2
@-诺里- 这Write Write_Read这两个操作文档说都会截断文件,我问了文心一言python的w,w+也类似会导致文件内容被截断,相当于清空文件
2025年01月29日 02点01分
但是WHITE_READ也会清空文件内容,哪怕调用了seek_end()也不管用啊[阴险]
2025年01月29日 02点01分
啊,我上面是看错文档了,用成 READ_WRITE 了,但是改为 WRITE_READ 又不会追加写入了,seek_end 也没用,请问是不是要更新 4.4 才行呀?[狂汗]
2025年01月29日 07点01分
level 8
旋转的刀 楼主
哦哦,我懂了。
READ、READ_WRITE:不会自动创建文件,也不会清空文件;
WRITE、WRITE_READ:会自动创建文件,也会清空文件;
所以 FileAccess 这个类蛮适合做游戏存档用,因为游戏存档不需要追加写入,但我是用来写一个记录日志的工具,需要追加写入,所以就不合适了。
我想了一个办法,就是程序每次运行,都根据时间戳创建一个新的日志文件,这样就OK了,感谢吧主[哈哈][玫瑰][玫瑰]
2025年01月29日 09点01分 3
实时存档的话还是需要追加写入的(只写入发生变化的属性),比写完整存档要快,不过会导致存档文件越来越大需要不定期清零
2025年01月29日 13点01分
@-诺里- 感觉有点难,对4.3还是不想了。我今天想用一个很基础很基础的功能,发现4.3都不支持,就是我想在声明一个字典变量时,直接指定 key 和 value 的类型,发现只有4.4测试版才支持,吐血了,物理引擎都有,结果基本的语法编辑器都没有做好[黑线]
2025年02月02日 06点02分
吧务
level 13
[哈哈]
2025年01月29日 11点01分 4
1