Added File.get_path and File.get_path_absolute functions

(cherry picked from commit a4e64c5454)
This commit is contained in:
Marcelo Fernandez 2018-03-09 11:45:21 -03:00 committed by Hein-Pieter van Braam
parent 41f360f9c2
commit 272fb05270
8 changed files with 70 additions and 5 deletions

View File

@ -1519,6 +1519,17 @@ bool _File::is_open() const {
return f != NULL; return f != NULL;
} }
String _File::get_path() const {
ERR_FAIL_COND_V(!f, "");
return f->get_path();
}
String _File::get_path_absolute() const {
ERR_FAIL_COND_V(!f, "");
return f->get_path_absolute();
}
void _File::seek(int64_t p_position) { void _File::seek(int64_t p_position) {
@ -1808,6 +1819,8 @@ void _File::_bind_methods() {
ClassDB::bind_method(D_METHOD("open", "path", "flags"), &_File::open); ClassDB::bind_method(D_METHOD("open", "path", "flags"), &_File::open);
ClassDB::bind_method(D_METHOD("close"), &_File::close); ClassDB::bind_method(D_METHOD("close"), &_File::close);
ClassDB::bind_method(D_METHOD("get_path"), &_File::get_path);
ClassDB::bind_method(D_METHOD("get_path_absolute"), &_File::get_path_absolute);
ClassDB::bind_method(D_METHOD("is_open"), &_File::is_open); ClassDB::bind_method(D_METHOD("is_open"), &_File::is_open);
ClassDB::bind_method(D_METHOD("seek", "position"), &_File::seek); ClassDB::bind_method(D_METHOD("seek", "position"), &_File::seek);
ClassDB::bind_method(D_METHOD("seek_end", "position"), &_File::seek_end, DEFVAL(0)); ClassDB::bind_method(D_METHOD("seek_end", "position"), &_File::seek_end, DEFVAL(0));

View File

@ -410,6 +410,9 @@ public:
void close(); ///< close a file void close(); ///< close a file
bool is_open() const; ///< true when file is open bool is_open() const; ///< true when file is open
String get_path() const; /// returns the path for the current open file
String get_path_absolute() const; /// returns the absolute path for the current open file
void seek(int64_t p_position); ///< seek to a given position void seek(int64_t p_position); ///< seek to a given position
void seek_end(int64_t p_position = 0); ///< seek from the end of file void seek_end(int64_t p_position = 0); ///< seek from the end of file
int64_t get_position() const; ///< get position in the file int64_t get_position() const; ///< get position in the file

View File

@ -89,6 +89,9 @@ public:
virtual void close() = 0; ///< close a file virtual void close() = 0; ///< close a file
virtual bool is_open() const = 0; ///< true when file is open virtual bool is_open() const = 0; ///< true when file is open
virtual String get_path() const { return ""; } /// returns the path for the current open file
virtual String get_path_absolute() const { return ""; } /// returns the absolute path for the current open file
virtual void seek(size_t p_position) = 0; ///< seek to a given position virtual void seek(size_t p_position) = 0; ///< seek to a given position
virtual void seek_end(int64_t p_position = 0) = 0; ///< seek from the end of file virtual void seek_end(int64_t p_position = 0) = 0; ///< seek from the end of file
virtual size_t get_position() const = 0; ///< get position in the file virtual size_t get_position() const = 0; ///< get position in the file

View File

@ -163,6 +163,20 @@
Returns a [String] saved in Pascal format from the file. Returns a [String] saved in Pascal format from the file.
</description> </description>
</method> </method>
<method name="get_path">
<return type="String">
</return>
<description>
Returns the path as a [String] for the current open file.
</description>
</method>
<method name="get_path_absolute">
<return type="String">
</return>
<description>
Returns the absolute path as a [String] for the current open file.
</description>
</method>
<method name="get_position" qualifiers="const"> <method name="get_position" qualifiers="const">
<return type="int"> <return type="int">
</return> </return>

View File

@ -69,6 +69,7 @@ Error FileAccessUnix::_open(const String &p_path, int p_mode_flags) {
fclose(f); fclose(f);
f = NULL; f = NULL;
path_src = p_path;
path = fix_path(p_path); path = fix_path(p_path);
//printf("opening %ls, %i\n", path.c_str(), Memory::get_static_mem_usage()); //printf("opening %ls, %i\n", path.c_str(), Memory::get_static_mem_usage());
@ -152,6 +153,16 @@ bool FileAccessUnix::is_open() const {
return (f != NULL); return (f != NULL);
} }
String FileAccessUnix::get_path() const {
return path_src;
}
String FileAccessUnix::get_path_absolute() const {
return path;
}
void FileAccessUnix::seek(size_t p_position) { void FileAccessUnix::seek(size_t p_position) {
ERR_FAIL_COND(!f); ERR_FAIL_COND(!f);

View File

@ -51,6 +51,7 @@ class FileAccessUnix : public FileAccess {
mutable Error last_error; mutable Error last_error;
String save_path; String save_path;
String path; String path;
String path_src;
static FileAccess *create_libc(); static FileAccess *create_libc();
@ -61,6 +62,9 @@ public:
virtual void close(); ///< close a file virtual void close(); ///< close a file
virtual bool is_open() const; ///< true when file is open virtual bool is_open() const; ///< true when file is open
virtual String get_path() const; /// returns the path for the current open file
virtual String get_path_absolute() const; /// returns the absolute path for the current open file
virtual void seek(size_t p_position); ///< seek to a given position virtual void seek(size_t p_position); ///< seek to a given position
virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file
virtual size_t get_position() const; ///< get position in the file virtual size_t get_position() const; ///< get position in the file

View File

@ -57,7 +57,8 @@ void FileAccessWindows::check_errors() const {
Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) { Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
String filename = fix_path(p_path); path_src = p_path;
path = fix_path(p_path);
if (f) if (f)
close(); close();
@ -78,19 +79,19 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
backend supports utf8 encoding */ backend supports utf8 encoding */
struct _stat st; struct _stat st;
if (_wstat(filename.c_str(), &st) == 0) { if (_wstat(path.c_str(), &st) == 0) {
if (!S_ISREG(st.st_mode)) if (!S_ISREG(st.st_mode))
return ERR_FILE_CANT_OPEN; return ERR_FILE_CANT_OPEN;
}; };
if (is_backup_save_enabled() && p_mode_flags & WRITE && !(p_mode_flags & READ)) { if (is_backup_save_enabled() && p_mode_flags & WRITE && !(p_mode_flags & READ)) {
save_path = filename; save_path = path;
filename = filename + ".tmp"; path = path + ".tmp";
//print_line("saving instead to "+path); //print_line("saving instead to "+path);
} }
f = _wfopen(filename.c_str(), mode_string); f = _wfopen(path.c_str(), mode_string);
if (f == NULL) { if (f == NULL) {
last_error = ERR_FILE_CANT_OPEN; last_error = ERR_FILE_CANT_OPEN;
@ -157,6 +158,17 @@ void FileAccessWindows::close() {
ERR_FAIL_COND(rename_error); ERR_FAIL_COND(rename_error);
} }
} }
String FileAccessWindows::get_path() const {
return path_src;
}
String FileAccessWindows::get_path_absolute() const {
return path;
}
bool FileAccessWindows::is_open() const { bool FileAccessWindows::is_open() const {
return (f != NULL); return (f != NULL);

View File

@ -46,6 +46,8 @@ class FileAccessWindows : public FileAccess {
int flags; int flags;
void check_errors() const; void check_errors() const;
mutable Error last_error; mutable Error last_error;
String path;
String path_src;
String save_path; String save_path;
public: public:
@ -53,6 +55,9 @@ public:
virtual void close(); ///< close a file virtual void close(); ///< close a file
virtual bool is_open() const; ///< true when file is open virtual bool is_open() const; ///< true when file is open
virtual String get_path() const; /// returns the path for the current open file
virtual String get_path_absolute() const; /// returns the absolute path for the current open file
virtual void seek(size_t p_position); ///< seek to a given position virtual void seek(size_t p_position); ///< seek to a given position
virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file
virtual size_t get_position() const; ///< get position in the file virtual size_t get_position() const; ///< get position in the file