Browse Source

Test and warn of case mismatch on Windows

Will throw a warning when a file is opened with a different case than what is stored on the Windows filesystem.
Juan Linietsky 7 years ago
parent
commit
44989bc957
1 changed files with 18 additions and 0 deletions
  1. 18 0
      drivers/windows/file_access_windows.cpp

+ 18 - 0
drivers/windows/file_access_windows.cpp

@@ -78,6 +78,7 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
 	/* pretty much every implementation that uses fopen as primary
 	   backend supports utf8 encoding */
 
+
 	struct _stat st;
 	if (_wstat(path.c_str(), &st) == 0) {
 
@@ -85,6 +86,23 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
 			return ERR_FILE_CANT_OPEN;
 	};
 
+#ifdef TOOLS_ENABLED
+	if (p_mode_flags==READ) {
+		WIN32_FIND_DATAW d = {0};
+		HANDLE f = FindFirstFileW(filename.c_str(),&d);
+		if (f) {
+			String fname = d.cFileName;
+			if (fname!=String()) {
+
+				String base_file = filename.get_file();
+				if (base_file!=fname && base_file.findn(fname)==0) {
+					WARN_PRINTS("Case mismatch opening file '"+base_file+"', stored as '"+fname+"' in the filesystem. This file will not open when exported to other platforms.");
+				}
+			}
+			FindClose(f);
+		}
+	}
+#endif
 	if (is_backup_save_enabled() && p_mode_flags & WRITE && !(p_mode_flags & READ)) {
 		save_path = path;
 		path = path + ".tmp";