Salome HOME
Fix the problem with saving a file with several meshes under Windows.
authorrnv <rnv@opencascade.com>
Thu, 7 May 2020 14:14:56 +0000 (17:14 +0300)
committerrnv <rnv@opencascade.com>
Thu, 7 May 2020 14:14:56 +0000 (17:14 +0300)
src/MEDWrapper/MED_Wrapper.cxx

index 7a7e968a89b6ef5d5ef3bbb31b68de52f52dc508..81d3ba9ec5c3797fd8ef47cc26bb66f7bf69fb1a 100644 (file)
 #include <med_err.h>
 #include <med_proto.h>
 
+#ifdef WIN32
+#include <windows.h>
+#endif
+
 #include <boost/version.hpp>
 
 #ifdef _DEBUG_
@@ -100,6 +104,23 @@ namespace MED
     {
       if (myCount++ == 0) {
         const char* aFileName = myFileName.c_str();
+#ifdef WIN32
+               if (med_access_mode(theMode) == MED_ACC_RDWR) {
+                       // Force removing readonly attribute from a file under Windows, because of a bug in the HDF5
+                       std::string aReadOlnyRmCmd = "attrib -r \"" + myFileName + "\"> nul 2>&1";
+#ifdef UNICODE
+                       const char* to_decode = aReadOlnyRmCmd.c_str();
+                       int size_needed = MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), NULL, 0);
+                       wchar_t* awReadOlnyRmCmd = new wchar_t[size_needed + 1];
+                       MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), awReadOlnyRmCmd, size_needed);
+                       awReadOlnyRmCmd[size_needed] = '\0';
+                       _wsystem(awReadOlnyRmCmd);
+                       delete[] awReadOlnyRmCmd;
+#else  
+                       system(aReadOlnyRmCmd.c_str());
+#endif
+               }
+#endif
         myFid = MEDfileVersionOpen(aFileName,med_access_mode(theMode), myMajor, myMinor, MED_RELEASE_NUM);
       }
       if (theErr)