فهرست منبع

added get_creation_time function for gdscript

Daniele Giuliani 7 سال پیش
والد
کامیت
d315b0fb8a

+ 8 - 0
core/bind/core_bind.cpp

@@ -1855,6 +1855,12 @@ uint64_t _File::get_modified_time(const String &p_file) const {
 	return FileAccess::get_modified_time(p_file);
 }
 
+// NEW FUNCTION
+uint64_t _File::get_creation_time(const String &p_file) const {
+
+	return FileAccess::get_creation_time(p_file);
+}
+
 void _File::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("open_encrypted", "path", "mode_flags", "key"), &_File::open_encrypted);
@@ -1906,6 +1912,7 @@ void _File::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("file_exists", "path"), &_File::file_exists);
 	ClassDB::bind_method(D_METHOD("get_modified_time", "file"), &_File::get_modified_time);
+	ClassDB::bind_method(D_METHOD("get_creation_time", "file"), &_File::get_creation_time); // NEW FUNCTION
 
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "endian_swap"), "set_endian_swap", "get_endian_swap");
 
@@ -2106,6 +2113,7 @@ void _Directory::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("file_exists", "path"), &_Directory::file_exists);
 	ClassDB::bind_method(D_METHOD("dir_exists", "path"), &_Directory::dir_exists);
 	//ClassDB::bind_method(D_METHOD("get_modified_time","file"),&_Directory::get_modified_time);
+	//ClassDB::bind_method(D_METHOD("get_creation_time","file"),&_Directory::get_creation_time); // NEW FUNCTION
 	ClassDB::bind_method(D_METHOD("get_space_left"), &_Directory::get_space_left);
 	ClassDB::bind_method(D_METHOD("copy", "from", "to"), &_Directory::copy);
 	ClassDB::bind_method(D_METHOD("rename", "from", "to"), &_Directory::rename);

+ 1 - 0
core/bind/core_bind.h

@@ -481,6 +481,7 @@ public:
 	bool file_exists(const String &p_name) const; ///< return true if a file exists
 
 	uint64_t get_modified_time(const String &p_file) const;
+	uint64_t get_creation_time(const String &p_file) const; // NEW FUNCTION
 
 	_File();
 	virtual ~_File();

+ 6 - 0
core/io/file_access_buffered_fa.h

@@ -143,6 +143,12 @@ public:
 		return f._get_modified_time(p_file);
 	}
 
+// NEW FUNCTION
+	virtual uint64_t _get_creation_time(const String &p_file) {
+
+		return f._get_creation_time(p_file);
+	}
+
 	FileAccessBufferedFA(){
 
 	};

+ 9 - 0
core/io/file_access_compressed.cpp

@@ -372,6 +372,15 @@ uint64_t FileAccessCompressed::_get_modified_time(const String &p_file) {
 		return 0;
 }
 
+// NEW FUNCTION
+uint64_t FileAccessCompressed::_get_creation_time(const String &p_file) {
+
+	if (f)
+		return f->get_creation_time(p_file);
+	else
+		return 0;
+}
+
 FileAccessCompressed::FileAccessCompressed() {
 
 	f = NULL;

+ 1 - 0
core/io/file_access_compressed.h

@@ -91,6 +91,7 @@ public:
 	virtual bool file_exists(const String &p_name); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file);
+	virtual uint64_t _get_creation_time(const String &p_file);// NEW FUNCTION
 
 	FileAccessCompressed();
 	virtual ~FileAccessCompressed();

+ 6 - 0
core/io/file_access_encrypted.cpp

@@ -302,6 +302,12 @@ uint64_t FileAccessEncrypted::_get_modified_time(const String &p_file) {
 	return 0;
 }
 
+// NEW FUNCTION
+uint64_t FileAccessEncrypted::_get_creation_time(const String &p_file) {
+
+	return 0;
+}
+
 FileAccessEncrypted::FileAccessEncrypted() {
 
 	file = NULL;

+ 1 - 0
core/io/file_access_encrypted.h

@@ -79,6 +79,7 @@ public:
 	virtual bool file_exists(const String &p_name); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file);
+	virtual uint64_t _get_creation_time(const String &p_file); // NEW FUNCTION
 
 	FileAccessEncrypted();
 	~FileAccessEncrypted();

+ 1 - 0
core/io/file_access_memory.h

@@ -70,6 +70,7 @@ public:
 	virtual bool file_exists(const String &p_name); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file) { return 0; }
+	virtual uint64_t _get_creation_time(const String &p_file) { return 0; } // NEW FUNCTION
 
 	FileAccessMemory();
 };

+ 18 - 0
core/io/file_access_network.cpp

@@ -498,6 +498,24 @@ uint64_t FileAccessNetwork::_get_modified_time(const String &p_file) {
 	return exists_modtime;
 }
 
+// NEW FUNCTION
+uint64_t FileAccessNetwork::_get_creation_time(const String &p_file) {
+
+	FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
+	nc->lock_mutex();
+	nc->put_32(id);
+	nc->put_32(COMMAND_GET_MODTIME);
+	CharString cs = p_file.utf8();
+	nc->put_32(cs.length());
+	nc->client->put_data((const uint8_t *)cs.ptr(), cs.length());
+	nc->unlock_mutex();
+	DEBUG_PRINT("MODTIME POST");
+	nc->sem->post();
+	sem->wait();
+
+	return exists_modtime;
+}
+
 void FileAccessNetwork::configure() {
 
 	GLOBAL_DEF("network/remote_fs/page_size", 65536);

+ 1 - 0
core/io/file_access_network.h

@@ -162,6 +162,7 @@ public:
 	virtual bool file_exists(const String &p_path); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file);
+	virtual uint64_t _get_creation_time(const String &p_file); // NEW FUNCTION
 
 	static void configure();
 

+ 1 - 0
core/io/file_access_pack.h

@@ -142,6 +142,7 @@ class FileAccessPack : public FileAccess {
 	FileAccess *f;
 	virtual Error _open(const String &p_path, int p_mode_flags);
 	virtual uint64_t _get_modified_time(const String &p_file) { return 0; }
+	virtual uint64_t _get_creation_time(const String &p_file) { return 0; } // NEW FUNCTION
 
 public:
 	virtual void close();

+ 1 - 0
core/io/file_access_zip.h

@@ -114,6 +114,7 @@ public:
 	virtual bool file_exists(const String &p_name); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file) { return 0; } // todo
+	virtual uint64_t _get_creation_time(const String &p_file) { return 0; } // NEW FUNCTION
 
 	FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file);
 	~FileAccessZip();

+ 1 - 0
core/io/resource_loader.cpp

@@ -231,6 +231,7 @@ RES ResourceLoader::load(const String &p_path, const String &p_type_hint, bool p
 	res->set_edited(false);
 	if (timestamp_on_load) {
 		uint64_t mt = FileAccess::get_modified_time(path);
+		uint64_t ct = FileAccess::get_creation_time(path); // NEW FUNCTION
 		//printf("mt %s: %lli\n",remapped_path.utf8().get_data(),mt);
 		res->set_last_modified_time(mt);
 	}

+ 1 - 0
core/io/resource_saver.cpp

@@ -80,6 +80,7 @@ Error ResourceSaver::save(const String &p_path, const RES &p_resource, uint32_t
 			((Resource *)p_resource.ptr())->set_edited(false);
 			if (timestamp_on_save) {
 				uint64_t mt = FileAccess::get_modified_time(p_path);
+				uint64_t ct = FileAccess::get_creation_time(p_path); // NEW FUNCTION
 
 				((Resource *)p_resource.ptr())->set_last_modified_time(mt);
 			}

+ 13 - 0
core/os/file_access.cpp

@@ -489,6 +489,19 @@ uint64_t FileAccess::get_modified_time(const String &p_file) {
 	memdelete(fa);
 	return mt;
 }
+// NEW FUNCTION
+uint64_t FileAccess::get_creation_time(const String &p_file) {
+
+	if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file))
+		return 0;
+
+	FileAccess *fa = create_for_path(p_file);
+	ERR_FAIL_COND_V(!fa, 0);
+
+	uint64_t ct = fa->_get_creation_time(p_file);
+	memdelete(fa);
+	return ct;
+}
 
 void FileAccess::store_string(const String &p_string) {
 

+ 2 - 0
core/os/file_access.h

@@ -59,6 +59,7 @@ protected:
 	String fix_path(const String &p_path) const;
 	virtual Error _open(const String &p_path, int p_mode_flags) = 0; ///< open a file
 	virtual uint64_t _get_modified_time(const String &p_file) = 0;
+	virtual uint64_t _get_creation_time(const String &p_file) = 0; // NEW FUNCTION
 
 	static FileCloseFailNotify close_fail_notify;
 
@@ -153,6 +154,7 @@ public:
 	static CreateFunc get_create_func(AccessType p_access);
 	static bool exists(const String &p_name); ///< return true if a file exists
 	static uint64_t get_modified_time(const String &p_file);
+	static uint64_t get_creation_time(const String &p_file); // NEW FUNCTION
 
 	static void set_backup_save(bool p_enable) { backup_save = p_enable; };
 	static bool is_backup_save_enabled() { return backup_save; };

+ 20 - 0
drivers/unix/dir_access_unix.cpp

@@ -124,6 +124,26 @@ uint64_t DirAccessUnix::get_modified_time(String p_file) {
 	return 0;
 };
 
+// NEW FUNCTION
+uint64_t DirAccessUnix::get_creation_time(String p_file) {
+
+	if (p_file.is_rel_path())
+		p_file = current_dir.plus_file(p_file);
+
+	p_file = fix_path(p_file);
+
+	struct stat flags;
+	bool success = (stat(p_file.utf8().get_data(), &flags) == 0);
+
+	if (success) {
+		return flags.st_ctime;
+	} else {
+
+		ERR_FAIL_V(0);
+	};
+	return 0;
+};
+
 String DirAccessUnix::get_next() {
 
 	if (!dir_stream)

+ 1 - 0
drivers/unix/dir_access_unix.h

@@ -75,6 +75,7 @@ public:
 	virtual bool dir_exists(String p_dir);
 
 	virtual uint64_t get_modified_time(String p_file);
+	virtual uint64_t get_creation_time(String p_file); // NEW FUNCTION
 
 	virtual Error rename(String p_path, String p_new_path);
 	virtual Error remove(String p_path);

+ 16 - 0
drivers/unix/file_access_unix.cpp

@@ -297,6 +297,22 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) {
 	};
 }
 
+// NEW FUNCTION
+uint64_t FileAccessUnix::_get_creation_time(const String &p_file) {
+
+	String file = fix_path(p_file);
+	struct stat flags;
+	int err = stat(file.utf8().get_data(), &flags);
+
+	if (!err) {
+		return flags.st_ctime;
+	} else {
+		print_line("ERROR IN: " + p_file);
+
+		ERR_FAIL_V(0);
+	};
+}
+
 Error FileAccessUnix::_chmod(const String &p_path, int p_mod) {
 	int err = chmod(p_path.utf8().get_data(), p_mod);
 	if (!err) {

+ 1 - 0
drivers/unix/file_access_unix.h

@@ -84,6 +84,7 @@ public:
 	virtual bool file_exists(const String &p_path); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file);
+	virtual uint64_t _get_creation_time(const String &p_file); // NEW FUNCTION
 
 	virtual Error _chmod(const String &p_path, int p_mod);
 

+ 20 - 0
drivers/windows/file_access_windows.cpp

@@ -311,6 +311,26 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) {
 	ERR_FAIL_V(0);
 };
 
+// NEW FUNCTION
+uint64_t FileAccessWindows::_get_creation_time(const String &p_file) {
+
+	String file = fix_path(p_file);
+	if (file.ends_with("/") && file != "/")
+		file = file.substr(0, file.length() - 1);
+
+	struct _stat st;
+	int rv = _wstat(file.c_str(), &st);
+
+	if (rv == 0) {
+
+		return st.st_ctime;
+	} else {
+		print_line("no access to " + file);
+	}
+
+	ERR_FAIL_V(0);
+};
+
 FileAccessWindows::FileAccessWindows() {
 
 	f = NULL;

+ 1 - 0
drivers/windows/file_access_windows.h

@@ -77,6 +77,7 @@ public:
 	virtual bool file_exists(const String &p_name); ///< return true if a file exists
 
 	uint64_t _get_modified_time(const String &p_file);
+	uint64_t _get_creation_time(const String &p_file); // NEW FUNCTION
 
 	FileAccessWindows();
 	virtual ~FileAccessWindows();

+ 2 - 0
modules/mono/mono_gd/gd_mono_assembly.h

@@ -77,6 +77,7 @@ class GDMonoAssembly {
 	String name;
 	String path;
 	uint64_t modified_time;
+	uint64_t creation_time; // NEW FUNCTION
 
 	HashMap<ClassKey, GDMonoClass *, ClassKey::Hasher> cached_classes;
 	Map<MonoClass *, GDMonoClass *> cached_raw;
@@ -116,6 +117,7 @@ public:
 	_FORCE_INLINE_ String get_name() const { return name; }
 	_FORCE_INLINE_ String get_path() const { return path; }
 	_FORCE_INLINE_ uint64_t get_modified_time() const { return modified_time; }
+	_FORCE_INLINE_ uint64_t get_creation_time() const { return creation_time; } // NEW FUNCTION
 
 	GDMonoClass *get_class(const StringName &p_namespace, const StringName &p_name);
 	GDMonoClass *get_class(MonoClass *p_mono_class);

+ 1 - 0
platform/android/file_access_android.h

@@ -70,6 +70,7 @@ public:
 	virtual bool file_exists(const String &p_path); ///< return true if a file exists
 
 	virtual uint64_t _get_modified_time(const String &p_file) { return 0; }
+	virtual uint64_t _get_creation_time(const String &p_file) { return 0; } // NEW FUNCTION
 
 	//static void make_default();