Jelajahi Sumber

Add function to obtain filesystem type from DirAccess.
Change EditorFileSystem to not use directory modification times on FAT32, fixes #20946

Juan Linietsky 6 tahun lalu
induk
melakukan
6fa632b821

+ 4 - 0
core/io/file_access_pack.cpp

@@ -490,6 +490,10 @@ size_t DirAccessPack::get_space_left() {
 	return 0;
 }
 
+String DirAccessPack::get_filesystem_type() const {
+	return "PCK";
+}
+
 DirAccessPack::DirAccessPack() {
 
 	current = PackedData::get_singleton()->root;

+ 3 - 0
core/io/file_access_pack.h

@@ -221,6 +221,9 @@ public:
 
 	size_t get_space_left();
 
+	virtual String get_filesystem_type() const;
+
+
 	DirAccessPack();
 	~DirAccessPack();
 };

+ 1 - 0
core/os/dir_access.h

@@ -98,6 +98,7 @@ public:
 	virtual Error rename(String p_from, String p_to) = 0;
 	virtual Error remove(String p_name) = 0;
 
+	virtual String get_filesystem_type() const=0 ;
 	static String get_full_path(const String &p_path, AccessType p_access);
 	static DirAccess *create_for_path(const String &p_path);
 

+ 4 - 0
drivers/unix/dir_access_unix.cpp

@@ -407,6 +407,10 @@ size_t DirAccessUnix::get_space_left() {
 #endif
 };
 
+String DirAccessUnix::get_filesystem_type() const {
+	return ""; //TODO this should be implemented
+}
+
 DirAccessUnix::DirAccessUnix() {
 
 	dir_stream = 0;

+ 3 - 0
drivers/unix/dir_access_unix.h

@@ -82,6 +82,9 @@ public:
 
 	virtual size_t get_space_left();
 
+	virtual String get_filesystem_type() const;
+
+
 	DirAccessUnix();
 	~DirAccessUnix();
 };

+ 29 - 0
drivers/windows/dir_access_windows.cpp

@@ -346,6 +346,35 @@ size_t DirAccessWindows::get_space_left() {
 	return (size_t)bytes;
 }
 
+String DirAccessWindows::get_filesystem_type() const {
+	String path = fix_path(const_cast<DirAccessWindows*>(this)->get_current_dir());
+	print_line("fixed path: "+path);
+	int unit_end = path.find(":");
+	ERR_FAIL_COND_V(unit_end==-1,String());
+	String unit = path.substr(0,unit_end+1) + "\\";
+	print_line("unit: "+unit);
+
+	TCHAR szVolumeName[100]    = "";
+	TCHAR szFileSystemName[10] = "";
+	DWORD dwSerialNumber       = 0;
+	DWORD dwMaxFileNameLength  = 0;
+	DWORD dwFileSystemFlags    = 0;
+
+	if(::GetVolumeInformation(unit.utf8().get_data(),
+				    szVolumeName,
+				    sizeof(szVolumeName),
+				    &dwSerialNumber,
+				    &dwMaxFileNameLength,
+				    &dwFileSystemFlags,
+				    szFileSystemName,
+				  sizeof(szFileSystemName)) == TRUE) {
+
+		return String(szFileSystemName);
+	}
+
+	ERR_FAIL_V("");
+}
+
 DirAccessWindows::DirAccessWindows() {
 
 	p = memnew(DirAccessWindowsPrivate);

+ 3 - 0
drivers/windows/dir_access_windows.h

@@ -82,6 +82,9 @@ public:
 	//virtual FileType get_file_type() const;
 	size_t get_space_left();
 
+	virtual String get_filesystem_type() const;
+
+
 	DirAccessWindows();
 	~DirAccessWindows();
 };

+ 5 - 1
editor/editor_file_system.cpp

@@ -797,7 +797,7 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 	bool updated_dir = false;
 	String cd = p_dir->get_path();
 
-	if (current_mtime != p_dir->modified_time) {
+	if (current_mtime != p_dir->modified_time || using_fat_32) {
 
 		updated_dir = true;
 		p_dir->modified_time = current_mtime;
@@ -1809,10 +1809,14 @@ EditorFileSystem::EditorFileSystem() {
 	if (da->change_dir("res://.import") != OK) {
 		da->make_dir("res://.import");
 	}
+	//this should probably also work on Unix and use the string it returns for FAT32
+	using_fat_32 = da->get_filesystem_type()=="FAT32";
 	memdelete(da);
 
 	scan_total = 0;
 	update_script_classes_queued = false;
+
+
 }
 
 EditorFileSystem::~EditorFileSystem() {

+ 2 - 0
editor/editor_file_system.h

@@ -231,6 +231,8 @@ class EditorFileSystem : public Node {
 
 	static Error _resource_import(const String &p_path);
 
+	bool using_fat_32; //workaround for projects in FAT32 filesystem (pendrives, most of the time)
+
 protected:
 	void _notification(int p_what);
 	static void _bind_methods();

+ 6 - 0
platform/android/dir_access_jandroid.cpp

@@ -212,6 +212,12 @@ Error DirAccessJAndroid::remove(String p_name) {
 	ERR_FAIL_V(ERR_UNAVAILABLE);
 }
 
+String DirAccessJAndroid::get_filesystem_type() const {
+
+	return "APK";
+}
+
+
 //FileType get_file_type() const;
 size_t DirAccessJAndroid::get_space_left() {
 

+ 2 - 0
platform/android/dir_access_jandroid.h

@@ -75,6 +75,8 @@ public:
 	virtual Error rename(String p_from, String p_to);
 	virtual Error remove(String p_name);
 
+	virtual String get_filesystem_type() const;
+
 	//virtual FileType get_file_type() const;
 	size_t get_space_left();