-Add visible IO errors when closing a file fails due to it being locked (most likely on windows), closes #4760

This commit is contained in:
Juan Linietsky 2016-06-13 10:10:50 -03:00
parent f0abda999e
commit 7f02627290
6 changed files with 26 additions and 3 deletions

View file

@ -35,6 +35,8 @@
FileAccess::CreateFunc FileAccess::create_func[ACCESS_MAX]={0,0};
FileAccess::FileCloseFailNotify FileAccess::close_fail_notify=NULL;
bool FileAccess::backup_save=false;

View file

@ -47,6 +47,8 @@ public:
ACCESS_MAX
};
typedef void (*FileCloseFailNotify)(const String&);
typedef FileAccess*(*CreateFunc)();
bool endian_swap;
bool real_is_double;
@ -56,7 +58,7 @@ protected:
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;
static FileCloseFailNotify close_fail_notify;
private:
static bool backup_save;
@ -69,8 +71,12 @@ private:
return memnew( T );
}
public:
static void set_file_close_fail_notify_callback(FileCloseFailNotify p_cbk) { close_fail_notify=p_cbk; }
virtual void _set_access_type(AccessType p_access);
enum ModeFlags {

View file

@ -124,6 +124,11 @@ void FileAccessUnix::close() {
//unlink(save_path.utf8().get_data());
//print_line("renaming..");
int rename_error = rename((save_path+".tmp").utf8().get_data(),save_path.utf8().get_data());
if (rename_error && close_fail_notify) {
close_fail_notify(save_path);
}
save_path="";
ERR_FAIL_COND( rename_error != 0);
}

View file

@ -131,6 +131,10 @@ void FileAccessWindows::close() {
//atomic replace for existing file
rename_error = !ReplaceFileW(save_path.c_str(), (save_path+".tmp").c_str(), NULL, 2|4, NULL, NULL);
}
if (rename_error && close_fail_notify) {
close_fail_notify(save_path);
}
save_path="";
ERR_FAIL_COND( rename_error );
}

View file

@ -217,7 +217,7 @@ void EditorNode::_notification(int p_what) {
if (p_what==NOTIFICATION_EXIT_TREE) {
editor_data.save_editor_external_data();
FileAccess::set_file_close_fail_notify_callback(NULL);
log->deinit(); // do not get messages anymore
}
if (p_what==NOTIFICATION_PROCESS) {
@ -5138,6 +5138,10 @@ void EditorNode::_dropped_files(const Vector<String>& p_files,int p_screen) {
EditorImportExport::get_singleton()->get_import_plugin(i)->import_from_drop(p_files,cur_path);
}
}
void EditorNode::_file_access_close_error_notify(const String& p_str) {
add_io_error("Unable to write to file '"+p_str+"', file in use, locked or lacking permissions.");
}
void EditorNode::_bind_methods() {
@ -5233,7 +5237,6 @@ EditorNode::EditorNode() {
SceneState::set_disable_placeholders(true);
editor_initialize_certificates(); //for asset sharing
InputDefault *id = Input::get_singleton()->cast_to<InputDefault>();
if (id) {
@ -6575,6 +6578,7 @@ EditorNode::EditorNode() {
_load_docks();
FileAccess::set_file_close_fail_notify_callback(_file_access_close_error_notify);
}
@ -6582,6 +6586,7 @@ EditorNode::EditorNode() {
EditorNode::~EditorNode() {
memdelete( EditorHelp::get_doc_data() );
memdelete(editor_selection);
memdelete(editor_plugins_over);

View file

@ -574,6 +574,7 @@ private:
void _update_addon_config();
static void _file_access_close_error_notify(const String& p_str);
protected:
void _notification(int p_what);