diff --git a/OpenSim/Actuators/Test/testMuscles.cpp b/OpenSim/Actuators/Test/testMuscles.cpp index 3d25b87b79..1baf9f780c 100644 --- a/OpenSim/Actuators/Test/testMuscles.cpp +++ b/OpenSim/Actuators/Test/testMuscles.cpp @@ -429,8 +429,9 @@ void simulateMuscle( //An analysis only writes to a dir that exists, so create here. if(printResults){ - IO::makeDir("testMuscleResults"); - muscleAnalysis->printResults(actuatorType, "testMuscleResults"); + const std::string dirName = "testMuscleResults"; + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, dirName); + muscleAnalysis->printResults(actuatorType, dirName); } double muscleWork = muscWorkProbe->getProbeOutputs(si)(0); diff --git a/OpenSim/Common/FileAdapter.h b/OpenSim/Common/FileAdapter.h index 2cb9737955..7ef0b8aa21 100644 --- a/OpenSim/Common/FileAdapter.h +++ b/OpenSim/Common/FileAdapter.h @@ -70,6 +70,19 @@ class FileIsEmpty : public IOError { } }; +class UnableToCreateDirectory : public IOError { +public: + UnableToCreateDirectory(const std::string& file, + size_t line, + const std::string& func, + const std::string& directory) : + IOError(file, line, func) { + std::string msg = "Unable to create directory '" + directory + "'."; + + addMessage(msg); + } +}; + class FileExtensionNotFound : public InvalidArgument { public: FileExtensionNotFound(const std::string& file, diff --git a/OpenSim/Common/Storage.cpp b/OpenSim/Common/Storage.cpp index 38c62a8211..3cb7770e7d 100644 --- a/OpenSim/Common/Storage.cpp +++ b/OpenSim/Common/Storage.cpp @@ -2741,7 +2741,9 @@ print(const string &aFileName,const string &aMode, const string& aComment) const { // OPEN THE FILE FILE *fp = IO::OpenFile(aFileName,aMode); - if(fp==NULL) return(false); + OPENSIM_THROW_IF(fp==NULL, Exception, + "Storage: Failed to open file '" + aFileName + "' for writing.\n" + + "Verify that the destination directory is writable."); // WRITE THE HEADER int n=0,nTotal=0; @@ -2819,7 +2821,9 @@ print(const string &aFileName,double aDT,const string &aMode) const if (_fp!= NULL) fclose(_fp); // OPEN THE FILE FILE *fp = IO::OpenFile(aFileName,aMode); - if(fp==NULL) return(-1); + OPENSIM_THROW_IF(fp==NULL, Exception, + "Storage: Failed to open file '" + aFileName + "' for writing.\n" + + "Verify that the destination directory is writable."); // HOW MANY TIME STEPS? double ti = getFirstTime(); diff --git a/OpenSim/Examples/MuscleExample/mainFatigue.cpp b/OpenSim/Examples/MuscleExample/mainFatigue.cpp index 99ad43b6f7..ecccf49be4 100644 --- a/OpenSim/Examples/MuscleExample/mainFatigue.cpp +++ b/OpenSim/Examples/MuscleExample/mainFatigue.cpp @@ -240,8 +240,10 @@ int main() "tugOfWar_fatigue_forces.sto"); // Save the muscle analysis results - IO::makeDir("MuscleAnalysisResults"); - muscAnalysis->printResults("fatigue", "MuscleAnalysisResults"); + const std::string dirName = "MuscleAnalysisResults"; + IO::makeDir(dirName); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, dirName); + muscAnalysis->printResults("fatigue", dirName); // Save the OpenSim model to a file osimModel.print("tugOfWar_fatigue_model.osim"); diff --git a/OpenSim/Simulation/Model/AbstractTool.cpp b/OpenSim/Simulation/Model/AbstractTool.cpp index d9ccaea8cb..80aa5b46c5 100644 --- a/OpenSim/Simulation/Model/AbstractTool.cpp +++ b/OpenSim/Simulation/Model/AbstractTool.cpp @@ -548,7 +548,10 @@ printResults(const string &aBaseName,const string &aDir,double aDT, const string &aExtension) { cout<<"Printing results of investigation "<updAnalysisSet().printResults(aBaseName,aDir,aDT,aExtension); } diff --git a/OpenSim/Tools/CMCTool.cpp b/OpenSim/Tools/CMCTool.cpp index 042383fc54..77fe7b23a1 100644 --- a/OpenSim/Tools/CMCTool.cpp +++ b/OpenSim/Tools/CMCTool.cpp @@ -824,7 +824,13 @@ bool CMCTool::run() cmcActSubsystem.setCompleteState( s ); // Set output file names so that files are flushed regularly in case we fail - IO::makeDir(getResultsDir()); // Create directory for output in case it doesn't exist + // Create directory for output in case it doesn't exist + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } + manager.getStateStorage().setOutputFileName(getResultsDir() + "/" + getName() + "_states.sto"); try { manager.initialize(s); diff --git a/OpenSim/Tools/InverseDynamicsTool.cpp b/OpenSim/Tools/InverseDynamicsTool.cpp index a48745f9e2..b7e952e5dc 100644 --- a/OpenSim/Tools/InverseDynamicsTool.cpp +++ b/OpenSim/Tools/InverseDynamicsTool.cpp @@ -406,7 +406,12 @@ bool InverseDynamicsTool::run() genForceResults.setColumnLabels(labels); genForceResults.setName("Inverse Dynamics Generalized Forces"); - IO::makeDir(getResultsDir()); + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } + Storage::printResult(&genForceResults, _outputGenForceFileName, getResultsDir(), -1, ".sto"); IO::chDir(saveWorkingDirectory); @@ -415,7 +420,12 @@ bool InverseDynamicsTool::run() bodyForcesResults.setColumnLabels(body_force_labels); bodyForcesResults.setName("Inverse Dynamics Body Forces at Specified Joints"); - IO::makeDir(getResultsDir()); + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } + Storage::printResult(&bodyForcesResults, _outputBodyForcesAtJointsFileName, getResultsDir(), -1, ".sto"); IO::chDir(saveWorkingDirectory); } diff --git a/OpenSim/Tools/InverseKinematicsTool.cpp b/OpenSim/Tools/InverseKinematicsTool.cpp index 084455a91b..c9ed92ba1b 100644 --- a/OpenSim/Tools/InverseKinematicsTool.cpp +++ b/OpenSim/Tools/InverseKinematicsTool.cpp @@ -425,7 +425,11 @@ bool InverseKinematicsTool::run() modelMarkerErrors->setColumnLabels(labels); modelMarkerErrors->setName("Model Marker Errors from IK"); - IO::makeDir(getResultsDir()); + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } string errorFileName = trialName + "_ik_marker_errors"; Storage::printResult(modelMarkerErrors, errorFileName, getResultsDir(), -1, ".sto"); @@ -445,8 +449,13 @@ bool InverseKinematicsTool::run() } modelMarkerLocations->setColumnLabels(labels); modelMarkerLocations->setName("Model Marker Locations from IK"); - - IO::makeDir(getResultsDir()); + + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } + string markerFileName = trialName + "_ik_model_marker_locations"; Storage::printResult(modelMarkerLocations, markerFileName, getResultsDir(), -1, ".sto"); diff --git a/OpenSim/Tools/RRATool.cpp b/OpenSim/Tools/RRATool.cpp index 4ea62c3a55..aaa698b939 100644 --- a/OpenSim/Tools/RRATool.cpp +++ b/OpenSim/Tools/RRATool.cpp @@ -809,7 +809,13 @@ bool RRATool::run() cmcActSubsystem.setCompleteState( s ); // Set output file names so that files are flushed regularly in case we fail - IO::makeDir(getResultsDir()); // Create directory for output in case it doesn't exist + // Create directory for output in case it doesn't exist + if (!getResultsDir().empty()) { + IO::makeDir(getResultsDir()); + OPENSIM_THROW_IF(errno == ENOENT, UnableToCreateDirectory, + getResultsDir()); + } + manager.getStateStorage().setOutputFileName(getResultsDir() + "/" + getName() + "_states.sto"); try { manager.initialize(s);