Browse Source

Avoid recursion in filesystem scanning, closes #3838

Juan Linietsky 9 năm trước cách đây
mục cha
commit
41a26528e4
1 tập tin đã thay đổi với 25 bổ sung16 xóa
  1. 25 16
      tools/editor/editor_file_system.cpp

+ 25 - 16
tools/editor/editor_file_system.cpp

@@ -621,31 +621,40 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir,DirAccess
 	int total = dirs.size()+files.size();
 	int idx=0;
 
+
 	for (List<String>::Element *E=dirs.front();E;E=E->next(),idx++) {
 
 		if (da->change_dir(E->get())==OK) {
 
-			EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory );
+			String d = da->get_current_dir();
 
-			efd->parent=p_dir;
-			efd->name=E->get();
+			if (d==cd || !d.begins_with(cd)) {
+				da->change_dir(cd); //avoid recursion
+			} else {
 
-			_scan_new_dir(efd,da,p_progress.get_sub(idx,total));
 
-			int idx=0;
-			for(int i=0;i<p_dir->subdirs.size();i++) {
+				EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory );
 
-				if (efd->name<p_dir->subdirs[i]->name)
-					break;
-				idx++;
-			}
-			if (idx==p_dir->subdirs.size()) {
-				p_dir->subdirs.push_back(efd);
-			} else {
-				p_dir->subdirs.insert(idx,efd);
-			}
+				efd->parent=p_dir;
+				efd->name=E->get();
+
+				_scan_new_dir(efd,da,p_progress.get_sub(idx,total));
+
+				int idx=0;
+				for(int i=0;i<p_dir->subdirs.size();i++) {
+
+					if (efd->name<p_dir->subdirs[i]->name)
+						break;
+					idx++;
+				}
+				if (idx==p_dir->subdirs.size()) {
+					p_dir->subdirs.push_back(efd);
+				} else {
+					p_dir->subdirs.insert(idx,efd);
+				}
 
-			da->change_dir("..");
+				da->change_dir("..");
+			}
 		} else {
 			ERR_PRINTS(TTR("Cannot go into subdir:")+" "+E->get());
 		}