Merge pull request #18270 from akien-mga/windows-case-test

Fix case mismatch check on Windows
This commit is contained in:
Rémi Verschelde 2018-04-18 15:14:50 +02:00 committed by GitHub
commit 3da7263920
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -78,7 +78,6 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
/* pretty much every implementation that uses fopen as primary /* pretty much every implementation that uses fopen as primary
backend supports utf8 encoding */ backend supports utf8 encoding */
struct _stat st; struct _stat st;
if (_wstat(path.c_str(), &st) == 0) { if (_wstat(path.c_str(), &st) == 0) {
@ -87,26 +86,30 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
}; };
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
if (p_mode_flags==READ) { // Windows is case insensitive, but all other platforms are sensitive to it
WIN32_FIND_DATAW d = {0}; // To ease cross-platform development, we issue a warning if users try to access
HANDLE f = FindFirstFileW(filename.c_str(),&d); // a file using the wrong case (which *works* on Windows, but won't on other
// platforms).
if (p_mode_flags == READ) {
WIN32_FIND_DATAW d = { 0 };
HANDLE f = FindFirstFileW(path.c_str(), &d);
if (f) { if (f) {
String fname = d.cFileName; String fname = d.cFileName;
if (fname!=String()) { if (fname != String()) {
String base_file = filename.get_file(); String base_file = path.get_file();
if (base_file!=fname && base_file.findn(fname)==0) { 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."); WARN_PRINTS("Case mismatch opening requested file '" + base_file + "', stored as '" + fname + "' in the filesystem. This file will not open when exported to other case-sensitive platforms.");
} }
} }
FindClose(f); FindClose(f);
} }
} }
#endif #endif
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 = path; save_path = path;
path = path + ".tmp"; path = path + ".tmp";
//print_line("saving instead to "+path);
} }
f = _wfopen(path.c_str(), mode_string); f = _wfopen(path.c_str(), mode_string);