diff --git a/src/cli/main.cpp b/src/cli/main.cpp
index 2d9ca92..9779cae 100644
--- a/src/cli/main.cpp
+++ b/src/cli/main.cpp
@@ -343,7 +343,7 @@ int HLCmdLineApp::run ( const int argc, const char*argv[] )
     CmdLineOptions options ( argc, argv );
 
     // set data directory path, where /langDefs and /themes reside
-    string dataDirPath = ( options.getDataDir().empty() ) ?  Platform::getAppPath() :options.getDataDir();
+    string dataDirPath = options.getDataDir();
 
     if ( options.printVersion() ) {
         printVersionInfo(options.quietMode());
diff --git a/src/core/datadir.cpp b/src/core/datadir.cpp
index 558b66f..0841557 100644
--- a/src/core/datadir.cpp
+++ b/src/core/datadir.cpp
@@ -67,7 +67,13 @@ void DataDir::initSearchDirectories ( const string &userDefinedDir )
 #endif
 
 #else
+#ifndef __MINGW32__
     possibleDirs.push_back(Platform::getAppPath()); //not needed because of fallback in searchFile
+#else
+    possibleDirs.emplace_back(getSystemDataPath());
+    const std::string prefix = Platform::getPrefixPath();
+    possibleDirs.push_back(prefix + "etc\\highlight\\");
+#endif
 #endif
 }
 
@@ -138,8 +144,10 @@ const string DataDir::getSystemDataPath ( )
 #else
     return LSB_DATA_DIR;
 #endif
-#else
+#elif !defined(__MINGW32__)
     return Platform::getAppPath();
+#else
+    return Platform::getPrefixPath() + "share\\highlight\\";
 #endif
 }
 
@@ -155,7 +163,11 @@ const string  DataDir::getExtDir()
 
 const string DataDir::getDocDir()
 {
+#ifndef __MINGW32__
     return getSystemDataPath();
+#else
+    return getSystemDataPath() + "share\\doc\\highlight\\";
+#endif
 }
 
 const string DataDir::getEncodingHint (const string &syntax) {
diff --git a/src/core/platform_fs.cpp b/src/core/platform_fs.cpp
index f2abf35..d66f800 100644
--- a/src/core/platform_fs.cpp
+++ b/src/core/platform_fs.cpp
@@ -61,6 +61,15 @@ std::string getAppPath()
 }
 #endif
 
+std::string getPrefixPath()
+{
+    std::string prefix = getAppPath();
+    prefix.pop_back();
+    while (!prefix.empty() && (prefix.back() != '\\'))
+      prefix.pop_back();
+    return prefix;
+}
+
 std::string getHomePath()
 {
     return "";
@@ -368,7 +377,12 @@ int wildcmp ( const char *wild, const char *data )
 bool fileExists(const string &fName)
 {
     struct stat fileInfo;
-    return !stat(fName.c_str(),&fileInfo);
+    // MinGW’s stat() doesn’t work on paths with
+    //   - trailing separator (https://sourceforge.net/p/mingw-w64/bugs/810/)
+    //   - mix of forward (/) and back slashes (\\)
+    const string path = (fName.back() != pathSeparator) ?
+        fName : fName.substr(0, fName.size() - 1);
+    return stat(path.c_str(), &fileInfo) == 0;
 }
 
 //-D_FILE_OFFSET_BITS=64
@@ -376,7 +390,9 @@ bool fileExists(const string &fName)
 
 off_t fileSize(const string& fName) {
     struct stat fileInfo;
-    if(stat(fName.c_str(), &fileInfo) != 0) {
+    const string path = (fName.back() != pathSeparator) ?
+      fName : fName.substr(0, fName.size() - 1);
+    if (stat(path.c_str(), &fileInfo) != 0) {
         return 0;
     }
     return fileInfo.st_size;
diff --git a/src/include/platform_fs.h b/src/include/platform_fs.h
index 1ebc010..7120c03 100644
--- a/src/include/platform_fs.h
+++ b/src/include/platform_fs.h
@@ -29,6 +29,8 @@ extern const char pathSeparator;
 
 std::string getAppPath();
 
+std::string getPrefixPath();
+
 std::string getHomePath();
 
 std::string getTempFilePath();
