git-svn-id: https://svn.microneil.com/svn/CodeDweller/branches/adeniz_1@60 d34b734f-a00e-4b39-a726-e4eeb87269abadeniz_1
| // \file filesystem.cpp | |||||
| // | |||||
| // Copyright (C) 2014 MicroNeil Research Corporation. | |||||
| // | |||||
| // This program is part of the MicroNeil Research Open Library Project. For | |||||
| // more information go to http://www.microneil.com/OpenLibrary/index.html | |||||
| // | |||||
| // This program is free software; you can redistribute it and/or modify it | |||||
| // under the terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 2 of the License, or (at your | |||||
| // option) any later version. | |||||
| // | |||||
| // This program is distributed in the hope that it will be useful, but WITHOUT | |||||
| // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |||||
| // more details. | |||||
| // | |||||
| // You should have received a copy of the GNU General Public License along with | |||||
| // this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |||||
| // Place, Suite 330, Boston, MA 02111-1307 USA | |||||
| //============================================================================== | |||||
| #include <stdexcept> | |||||
| #include "filesystem.hpp" | |||||
| namespace CodeDweller { | |||||
| FileReference::FileReference(std::string fileName) : | |||||
| name(fileName), | |||||
| timestamp(0), | |||||
| size_bytes(0), | |||||
| fileExists(false), | |||||
| fileIsDirectory(false) { | |||||
| refresh(); | |||||
| } | |||||
| void FileReference::refresh() { | |||||
| // Load path if necessary. | |||||
| if (path.empty()) { | |||||
| char *realPath = realpath(name.c_str(), NULL); | |||||
| if (NULL == path) { | |||||
| // Nothing to do if the file doesn't exist. | |||||
| if (ENOENT == errno) { | |||||
| return; | |||||
| } | |||||
| // Something went wrong. | |||||
| throw std::runtime_error("Error checking file \"" + name "\": " + | |||||
| getErrorText()); | |||||
| } | |||||
| path = *realPath; | |||||
| free(realPath); | |||||
| } | |||||
| // Load info. | |||||
| struct stat statBuffer; | |||||
| int status = stat(path.c_str(), &statBuffer); | |||||
| if (-1 == status) { | |||||
| // File no longer exists. | |||||
| if (ENOENT == errno) { | |||||
| reset(); | |||||
| return; | |||||
| } | |||||
| // Something went wrong. | |||||
| throw std::runtime_error("Error updating status of file \"" + | |||||
| path "\": " + getErrorText()); | |||||
| } | |||||
| modTimestamp = statBuffer.st_mtime; | |||||
| size_bytes = statBuffer.st_size; | |||||
| fileExists = true; | |||||
| fileIsDirectory = S_ISDIR(statBuffer.st_mode); | |||||
| } | |||||
| void FileReference:: reset() { | |||||
| modTimestamp = 0; | |||||
| size_bytes = 0; | |||||
| fileExists = false; | |||||
| fileIsDirectory = false; | |||||
| } | |||||
| time_t FileReference::ModTimestamp() const { | |||||
| return modTimestamp; | |||||
| } | |||||
| long FileReference::Size() const { | |||||
| return size_bytes; | |||||
| } | |||||
| std::string FileReference::FullPath() const { | |||||
| return path; | |||||
| } | |||||
| time_t FileReference::exists() const { | |||||
| return fileExists; | |||||
| } | |||||
| time_t FileReference::isDirectory() const { | |||||
| return fileIsDirectory; | |||||
| } | |||||
| std::string FileReference::getErrorText() { | |||||
| #ifdef _WIN32 | |||||
| LPVOID winMsgBuf; | |||||
| DWORD lastError = GetLastError(); | |||||
| FormatMessage( | |||||
| FORMAT_MESSAGE_ALLOCATE_BUFFER | | |||||
| FORMAT_MESSAGE_FROM_SYSTEM | | |||||
| FORMAT_MESSAGE_IGNORE_INSERTS, | |||||
| NULL, | |||||
| lastError, | |||||
| MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |||||
| (char *) &winMsgBuf, | |||||
| 0, NULL ); | |||||
| std::string errMsg((char *) winMsgBuf); | |||||
| LocalFree(winMsgBuf); | |||||
| return errMsg; | |||||
| #else | |||||
| return strerror(errno); | |||||
| #endif | |||||
| } | |||||
| } |
| // \file filesystem.hpp | |||||
| // | |||||
| // Copyright (C) 2015 MicroNeil Research Corporation. | |||||
| // | |||||
| // This program is part of the MicroNeil Research Open Library Project. For | |||||
| // more information go to http://www.microneil.com/OpenLibrary/index.html | |||||
| // | |||||
| // This program is free software; you can redistribute it and/or modify it | |||||
| // under the terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 2 of the License, or (at your | |||||
| // option) any later version. | |||||
| // | |||||
| // This program is distributed in the hope that it will be useful, but WITHOUT | |||||
| // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |||||
| // more details. | |||||
| // | |||||
| // You should have received a copy of the GNU General Public License along with | |||||
| // this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |||||
| // Place, Suite 330, Boston, MA 02111-1307 USA | |||||
| //============================================================================== | |||||
| /* | |||||
| \brief The filesystem module provides classes to access the filesystem. | |||||
| */ | |||||
| #ifndef FILESYSTEM_HPP | |||||
| #define FILESYSTEM_HPP | |||||
| #include <ctime> | |||||
| #include <string> | |||||
| namespace CodeDweller { | |||||
| /** Abstracts OS specifics for identifying a file and provides | |||||
| access to meta data. | |||||
| */ | |||||
| class FileReference { | |||||
| public: | |||||
| /** Initialize with the name of the file. | |||||
| @param[in] fileName is the name of the file. | |||||
| */ | |||||
| FileReference(std::string fileName); | |||||
| /** Return timestamp. | |||||
| @returns the epoch modification time for file when | |||||
| FileReference was created or last refreshed, or zero if the | |||||
| file doesn't exist. | |||||
| */ | |||||
| time_t ModTimestamp() const; | |||||
| /** Get the file size. | |||||
| @returns the size of file when FileReference was created or | |||||
| last refreshed, or 0 if the file doesn't exist. | |||||
| */ | |||||
| long Size() const; | |||||
| /** Get full path. | |||||
| @returns a fully referenced path to the file. | |||||
| */ | |||||
| std:: string FullPath() const; | |||||
| /** Refreshes the FileReference object with the current data on the file | |||||
| system. | |||||
| */ | |||||
| void refresh(); | |||||
| /** Check if the file exists. | |||||
| @returns true if the file reference name exists in the file | |||||
| system, false otherwise. | |||||
| @throws std::runtime_error if an error occurs. | |||||
| */ | |||||
| bool exists() const; | |||||
| /** Check if the file is a directory. | |||||
| @returns true if the name provided on construction resulted in | |||||
| finding a directory not a file, and false otherwise or if the | |||||
| file doesn't exist. | |||||
| */ | |||||
| bool isDirectory() const; | |||||
| private: | |||||
| /// Return text for the most recent error. | |||||
| // | |||||
| // \returns Human-readable description of the most recent error. | |||||
| // | |||||
| static std::string getErrorText(); | |||||
| /** Name provided to constructor. */ | |||||
| std::string name; | |||||
| /** Full path. */ | |||||
| std::string path; | |||||
| /** Timestamp. */ | |||||
| time_t modTimestamp; | |||||
| /** Size in bytes. */ | |||||
| long size_bytes; | |||||
| /** True if the file exists, false otherwise. */ | |||||
| bool fileExists; | |||||
| /** True if the file is a directory, false otherwise. */ | |||||
| bool fileIsDirectory; | |||||
| }; | |||||
| } | |||||
| #endif // FILESYSTEM_HPP |