/** * Copyright 2019 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "dataset/util/path.h" #include #include #include #include #include "common/utils.h" #include "dataset/util/de_error.h" #include "utils/log_adapter.h" namespace mindspore { namespace dataset { #ifdef _WIN32 char Path::separator_ = '\\'; #else char Path::separator_ = '/'; #endif Path::Path(const std::string &s) : path_(s) {} Path::Path(const char *p) : path_(p) {} Path::Path(const Path &p) : path_(p.path_) {} Path &Path::operator=(const Path &p) { if (&p != this) { this->path_ = p.path_; } return *this; } Path &Path::operator=(Path &&p) noexcept { if (&p != this) { this->path_ = std::move(p.path_); } return *this; } Path::Path(Path &&p) noexcept { this->path_ = std::move(p.path_); } Path Path::operator+(const Path &p) { std::string q = path_ + p.toString(); return Path(q); } Path Path::operator+(const std::string &p) { std::string q = path_ + p; return Path(q); } Path Path::operator+(const char *p) { std::string q = path_ + p; return Path(q); } Path &Path::operator+=(const Path &rhs) { path_ += rhs.toString(); return *this; } Path &Path::operator+=(const std::string &p) { path_ += p; return *this; } Path &Path::operator+=(const char *p) { path_ += p; return *this; } Path Path::operator/(const Path &p) { std::string q = path_ + separator_ + p.toString(); return Path(q); } Path Path::operator/(const std::string &p) { std::string q = path_ + separator_ + p; return Path(q); } Path Path::operator/(const char *p) { std::string q = path_ + separator_ + p; return Path(q); } std::string Path::Extension() const { std::size_t found = path_.find_last_of('.'); if (found != std::string::npos) { return path_.substr(found); } else { return std::string(""); } } bool Path::Exists() { struct stat sb; int rc = stat(common::SafeCStr(path_), &sb); if (rc == -1 && errno != ENOENT) { MS_LOG(INFO) << "Unable to query the status of " << path_ << ". Errno = " << errno << "."; } return (rc == 0); } bool Path::IsDirectory() { struct stat sb; int rc = stat(common::SafeCStr(path_), &sb); if (rc == 0) { return S_ISDIR(sb.st_mode); } else { return false; } } Status Path::CreateDirectory() { if (!Exists()) { #if defined(_WIN32) || defined(_WIN64) int rc = mkdir(common::SafeCStr(path_)); #else int rc = mkdir(common::SafeCStr(path_), 0700); #endif if (rc) { std::ostringstream oss; oss << "Unable to create directory " << path_ << ". Errno = " << errno; RETURN_STATUS_UNEXPECTED(oss.str()); } return Status::OK(); } else { if (IsDirectory()) { return Status::OK(); } else { std::ostringstream oss; oss << "Unable to create directory " << path_ << ". It exists but is not a directory"; RETURN_STATUS_UNEXPECTED(oss.str()); } } } std::string Path::ParentPath() { std::string r(""); std::size_t found = path_.find_last_of(separator_); if (found != std::string::npos) { if (found == 0) { r += separator_; } else { r = std::string(path_.substr(0, found)); } } return r; } Status Path::CreateDirectories() { if (IsDirectory()) { MS_LOG(INFO) << "Directory " << toString() << " already exists."; return Status::OK(); } else { MS_LOG(INFO) << "Creating directory " << toString() << "."; std::string parent = ParentPath(); if (!parent.empty()) { if (Path(parent).CreateDirectories()) { return CreateDirectory(); } } else { return CreateDirectory(); } } return Status::OK(); } std::shared_ptr Path::DirIterator::OpenDirectory(Path *f) { auto it = new (std::nothrow) DirIterator(f); if (it == nullptr) { return nullptr; } if (it->dp_) { return std::shared_ptr(it); } else { delete it; return nullptr; } } Path::DirIterator::~DirIterator() { if (dp_) { (void)closedir(dp_); } dp_ = nullptr; dir_ = nullptr; entry_ = nullptr; } Path::DirIterator::DirIterator(Path *f) : dir_(f), dp_(nullptr), entry_(nullptr) { MS_LOG(INFO) << "Open directory " << f->toString() << "."; dp_ = opendir(common::SafeCStr(f->toString())); } bool Path::DirIterator::hasNext() { do { entry_ = readdir(dp_); if (entry_) { if (strcmp(entry_->d_name, ".") == 0 || strcmp(entry_->d_name, "..") == 0) { continue; } } break; } while (true); return (entry_ != nullptr); } Path Path::DirIterator::next() { return (*(this->dir_) / Path(entry_->d_name)); } } // namespace dataset } // namespace mindspore