diff --git a/src/OpenFOAM/db/IOobject/IOobject.C b/src/OpenFOAM/db/IOobject/IOobject.C index a65d80b7976c1c13c90ec0de0ec40d1a7daba74e..ba42a6c9bf6785d11b736703c9bd1ea60518718c 100644 --- a/src/OpenFOAM/db/IOobject/IOobject.C +++ b/src/OpenFOAM/db/IOobject/IOobject.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010, 2016-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2010, 2016-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2011-2017 OpenFOAM Foundation @@ -152,12 +152,18 @@ bool Foam::IOobject::fileNameComponents name = word::validate(path); } - else if (first == 0) + else if + ( + first == 0 + #ifdef _WIN32 + || (first == 2 && path[1] == ':') // Eg, d:/path + #endif + ) { // Absolute path (starts with '/') // => no local - instance = path.substr(0, last); + instance = path.substr(first, last); const std::string ending = path.substr(last+1); nameLen = ending.size(); // The raw length of name diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.C b/src/OpenFOAM/primitives/strings/fileName/fileName.C index 6cd6d1880716e3c09f660e64e20f4b7cf25a1002..03daab90e0be40f5f1d8c288cb8932291bfb3037 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileName.C +++ b/src/OpenFOAM/primitives/strings/fileName/fileName.C @@ -60,8 +60,20 @@ Foam::fileName Foam::fileName::validate std::string::size_type len = 0; + auto iter = s.cbegin(); + + #ifdef _WIN32 + // Preserve UNC \\server-name\... + if (s.length() > 2 && s[0] == '\\' && s[1] == '\\') + { + len += 2; + ++iter; + ++iter; + } + #endif + char prev = 0; - for (auto iter = s.cbegin(); iter != s.cend(); ++iter) + for (/*nil*/; iter != s.cend(); ++iter) { char c = *iter; @@ -74,6 +86,9 @@ Foam::fileName Foam::fileName::validate c = '/'; } + // Could explicitly allow space character or rely on + // allowSpaceInFileName via fileName::valid() + if (fileName::valid(c)) { if (doClean && prev == '/' && c == '/') diff --git a/src/OpenFOAM/primitives/strings/fileName/fileNameI.H b/src/OpenFOAM/primitives/strings/fileName/fileNameI.H index 53b5592efe61b93b460d16833f765c10cc8dc437..9b0ac46e09fd45a6967f60bc1c6268a2a2d13f0b 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileNameI.H +++ b/src/OpenFOAM/primitives/strings/fileName/fileNameI.H @@ -136,7 +136,18 @@ inline bool Foam::fileName::isAbsolute(const std::string& str) { return ( - !str.empty() && str[0] == '/' + (!str.empty() && str[0] == '/') + #ifdef _WIN32 + || + ( + // Eg, d:/path or \\machine/path + (str.length() > 2) && + ( + (str[1] == ':' && str[2] == '/') + || (str[0] == '\\' && str[1] == '\\') + ) + ) + #endif ); }