Browse Source

Restore FileAccess.close method.

bruvzg 2 years ago
parent
commit
bc95b0b171

+ 2 - 0
core/io/file_access.cpp

@@ -856,6 +856,8 @@ void FileAccess::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string);
 	ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string);
 	ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string);
 	ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string);
 
 
+	ClassDB::bind_method(D_METHOD("close"), &FileAccess::close);
+
 	ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists);
 	ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists);
 	ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time);
 	ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time);
 
 

+ 2 - 0
core/io/file_access.h

@@ -166,6 +166,8 @@ public:
 
 
 	void store_var(const Variant &p_var, bool p_full_objects = false);
 	void store_var(const Variant &p_var, bool p_full_objects = false);
 
 
+	virtual void close() = 0;
+
 	virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists
 	virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists
 
 
 	virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType
 	virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType

+ 4 - 0
core/io/file_access_compressed.cpp

@@ -385,6 +385,10 @@ Error FileAccessCompressed::_set_unix_permissions(const String &p_file, uint32_t
 	return FAILED;
 	return FAILED;
 }
 }
 
 
+void FileAccessCompressed::close() {
+	_close();
+}
+
 FileAccessCompressed::~FileAccessCompressed() {
 FileAccessCompressed::~FileAccessCompressed() {
 	_close();
 	_close();
 }
 }

+ 2 - 0
core/io/file_access_compressed.h

@@ -97,6 +97,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 
 
+	virtual void close() override;
+
 	FileAccessCompressed() {}
 	FileAccessCompressed() {}
 	virtual ~FileAccessCompressed();
 	virtual ~FileAccessCompressed();
 };
 };

+ 4 - 0
core/io/file_access_encrypted.cpp

@@ -294,6 +294,10 @@ Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t
 	return ERR_UNAVAILABLE;
 	return ERR_UNAVAILABLE;
 }
 }
 
 
+void FileAccessEncrypted::close() {
+	_close();
+}
+
 FileAccessEncrypted::~FileAccessEncrypted() {
 FileAccessEncrypted::~FileAccessEncrypted() {
 	_close();
 	_close();
 }
 }

+ 2 - 0
core/io/file_access_encrypted.h

@@ -88,6 +88,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 
 
+	virtual void close() override;
+
 	FileAccessEncrypted() {}
 	FileAccessEncrypted() {}
 	~FileAccessEncrypted();
 	~FileAccessEncrypted();
 };
 };

+ 2 - 0
core/io/file_access_memory.h

@@ -71,6 +71,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 
 
+	virtual void close() override {}
+
 	FileAccessMemory() {}
 	FileAccessMemory() {}
 };
 };
 
 

+ 9 - 0
core/io/file_access_network.cpp

@@ -469,6 +469,15 @@ void FileAccessNetwork::configure() {
 	GLOBAL_DEF(PropertyInfo(Variant::INT, "network/remote_fs/page_read_ahead", PROPERTY_HINT_RANGE, "0,8,1,or_greater"), 4);
 	GLOBAL_DEF(PropertyInfo(Variant::INT, "network/remote_fs/page_read_ahead", PROPERTY_HINT_RANGE, "0,8,1,or_greater"), 4);
 }
 }
 
 
+void FileAccessNetwork::close() {
+	_close();
+
+	FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
+	nc->lock_mutex();
+	nc->accesses.erase(id);
+	nc->unlock_mutex();
+}
+
 FileAccessNetwork::FileAccessNetwork() {
 FileAccessNetwork::FileAccessNetwork() {
 	FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
 	FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
 	nc->lock_mutex();
 	nc->lock_mutex();

+ 2 - 0
core/io/file_access_network.h

@@ -156,6 +156,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 
 
+	virtual void close() override;
+
 	static void configure();
 	static void configure();
 
 
 	FileAccessNetwork();
 	FileAccessNetwork();

+ 4 - 0
core/io/file_access_pack.cpp

@@ -366,6 +366,10 @@ bool FileAccessPack::file_exists(const String &p_name) {
 	return false;
 	return false;
 }
 }
 
 
+void FileAccessPack::close() {
+	f = Ref<FileAccess>();
+}
+
 FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) :
 FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) :
 		pf(p_file),
 		pf(p_file),
 		f(FileAccess::open(pf.pack, FileAccess::READ)) {
 		f(FileAccess::open(pf.pack, FileAccess::READ)) {

+ 2 - 0
core/io/file_access_pack.h

@@ -178,6 +178,8 @@ public:
 
 
 	virtual bool file_exists(const String &p_name) override;
 	virtual bool file_exists(const String &p_name) override;
 
 
+	virtual void close() override;
+
 	FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file);
 	FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file);
 };
 };
 
 

+ 4 - 0
core/io/file_access_zip.cpp

@@ -336,6 +336,10 @@ bool FileAccessZip::file_exists(const String &p_name) {
 	return false;
 	return false;
 }
 }
 
 
+void FileAccessZip::close() {
+	_close();
+}
+
 FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) {
 FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) {
 	open_internal(p_path, FileAccess::READ);
 	open_internal(p_path, FileAccess::READ);
 }
 }

+ 2 - 0
core/io/file_access_zip.h

@@ -109,6 +109,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 
 
+	virtual void close() override;
+
 	FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file);
 	FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file);
 	~FileAccessZip();
 	~FileAccessZip();
 };
 };

+ 8 - 1
doc/classes/FileAccess.xml

@@ -33,7 +33,7 @@
 		[/csharp]
 		[/csharp]
 		[/codeblocks]
 		[/codeblocks]
 		In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation.
 		In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation.
-		There is no method to close a file in order to free it from use. Instead, [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
+		[FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
 		[codeblocks]
 		[codeblocks]
 		[gdscript]
 		[gdscript]
 		var file = FileAccess.open("res://something") # File is opened and locked for use.
 		var file = FileAccess.open("res://something") # File is opened and locked for use.
@@ -52,6 +52,13 @@
 		<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
 		<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
 	</tutorials>
 	</tutorials>
 	<methods>
 	<methods>
+		<method name="close">
+			<return type="void" />
+			<description>
+				Closes the currently opened file and prevents subsequent read/write operations. Use flush to persist the data to disk without closing the file.
+				[b]Note:[/b] [FileAccess] will automatically close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
+			</description>
+		</method>
 		<method name="eof_reached" qualifiers="const">
 		<method name="eof_reached" qualifiers="const">
 			<return type="bool" />
 			<return type="bool" />
 			<description>
 			<description>

+ 4 - 0
drivers/unix/file_access_unix.cpp

@@ -318,6 +318,10 @@ Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_per
 	return FAILED;
 	return FAILED;
 }
 }
 
 
+void FileAccessUnix::close() {
+	_close();
+}
+
 CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr;
 CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr;
 
 
 FileAccessUnix::~FileAccessUnix() {
 FileAccessUnix::~FileAccessUnix() {

+ 2 - 0
drivers/unix/file_access_unix.h

@@ -82,6 +82,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 
 
+	virtual void close() override;
+
 	FileAccessUnix() {}
 	FileAccessUnix() {}
 	virtual ~FileAccessUnix();
 	virtual ~FileAccessUnix();
 };
 };

+ 5 - 0
drivers/windows/file_access_windows.cpp

@@ -375,6 +375,10 @@ Error FileAccessWindows::_set_unix_permissions(const String &p_file, uint32_t p_
 	return ERR_UNAVAILABLE;
 	return ERR_UNAVAILABLE;
 }
 }
 
 
+void FileAccessWindows::close() {
+	_close();
+}
+
 FileAccessWindows::~FileAccessWindows() {
 FileAccessWindows::~FileAccessWindows() {
 	_close();
 	_close();
 }
 }
@@ -391,6 +395,7 @@ void FileAccessWindows::initialize() {
 		reserved_file_index++;
 		reserved_file_index++;
 	}
 	}
 }
 }
+
 void FileAccessWindows::finalize() {
 void FileAccessWindows::finalize() {
 	invalid_files.clear();
 	invalid_files.clear();
 }
 }

+ 2 - 0
drivers/windows/file_access_windows.h

@@ -82,6 +82,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual uint32_t _get_unix_permissions(const String &p_file) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
 
 
+	virtual void close() override;
+
 	static void initialize();
 	static void initialize();
 	static void finalize();
 	static void finalize();
 
 

+ 4 - 0
platform/android/file_access_android.cpp

@@ -169,6 +169,10 @@ bool FileAccessAndroid::file_exists(const String &p_path) {
 	return true;
 	return true;
 }
 }
 
 
+void FileAccessAndroid::close() {
+	_close();
+}
+
 FileAccessAndroid::~FileAccessAndroid() {
 FileAccessAndroid::~FileAccessAndroid() {
 	_close();
 	_close();
 }
 }

+ 2 - 0
platform/android/file_access_android.h

@@ -78,6 +78,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 
 
+	virtual void close() override;
+
 	~FileAccessAndroid();
 	~FileAccessAndroid();
 };
 };
 
 

+ 6 - 0
platform/android/file_access_filesystem_jandroid.cpp

@@ -333,6 +333,12 @@ void FileAccessFilesystemJAndroid::setup(jobject p_file_access_handler) {
 	_file_last_modified = env->GetMethodID(cls, "fileLastModified", "(Ljava/lang/String;)J");
 	_file_last_modified = env->GetMethodID(cls, "fileLastModified", "(Ljava/lang/String;)J");
 }
 }
 
 
+void FileAccessFilesystemJAndroid::close() {
+	if (is_open()) {
+		_close();
+	}
+}
+
 FileAccessFilesystemJAndroid::FileAccessFilesystemJAndroid() {
 FileAccessFilesystemJAndroid::FileAccessFilesystemJAndroid() {
 	id = 0;
 	id = 0;
 }
 }

+ 2 - 0
platform/android/file_access_filesystem_jandroid.h

@@ -93,6 +93,8 @@ public:
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
 
 
+	virtual void close() override;
+
 	FileAccessFilesystemJAndroid();
 	FileAccessFilesystemJAndroid();
 	~FileAccessFilesystemJAndroid();
 	~FileAccessFilesystemJAndroid();
 };
 };