Преглед на файлове

Extended File class (unstable)

- added "listFiles" method to File class (unstable)
- added tests for File class
Patrick преди 4 години
родител
ревизия
bc16ad938c
променени са 3 файла, в които са добавени 74 реда и са изтрити 8 реда
  1. 49 6
      source/io/File.cpp
  2. 4 2
      source/io/File.hpp
  3. 21 0
      test/cases/io/FileTest.cpp

+ 49 - 6
source/io/File.cpp

@@ -132,6 +132,17 @@ std::list<std::string> ls_std::File::list()
   return fileList;
 }
 
+std::list<std::string> ls_std::File::listFiles()
+{
+  std::list<std::string> fileList {};
+
+  if(ls_std::File::_isDirectory(this->absoluteFilePath)) {
+    fileList = ls_std::File::_listFiles(this->absoluteFilePath);
+  }
+
+  return fileList;
+}
+
 void ls_std::File::makeDirectory()
 {
   if(ls_std::File::_mkdir(this->absoluteFilePath)) {
@@ -231,25 +242,48 @@ std::list<std::string> ls_std::File::_list(const std::string &_path)
   std::list<std::string> filesInDirectory {};
 
   #if defined(unix) || defined(__APPLE__)
-    filesInDirectory = ls_std::File::_listUnix(_path);
+    filesInDirectory = ls_std::File::_listUnix(_path, true);
   #endif
   #ifdef _WIN32
-    filesInDirectory = ls_std::File::_listWindows(_path);
+    filesInDirectory = ls_std::File::_listWindows(_path, true);
+  #endif
+
+  return filesInDirectory;
+}
+
+std::list<std::string> ls_std::File::_listFiles(const std::string &_path)
+{
+  std::list<std::string> filesInDirectory {};
+
+  #if defined(unix) || defined(__APPLE__)
+    filesInDirectory = ls_std::File::_listUnix(_path, false);
+  #endif
+  #ifdef _WIN32
+    filesInDirectory = ls_std::File::_listWindows(_path, false);
   #endif
 
   return filesInDirectory;
 }
 
 #if defined(unix) || defined(__APPLE__)
-std::list<std::string> ls_std::File::_listUnix(const std::string &_path)
+std::list<std::string> ls_std::File::_listUnix(const std::string &_path, bool withDirectories)
 {
   std::list<std::string> filesInDirectory {};
   DIR* directory = opendir(_path.c_str());
   struct dirent* directoryEntity;
   std::string parent = ls_std::File::_getParent(_path);
+  std::string absolutePath {};
 
   while((directoryEntity = readdir(directory)) != nullptr) {
-    filesInDirectory.emplace_back(parent + directoryEntity->d_name);
+    absolutePath = parent + directoryEntity->d_name;
+
+    if(withDirectories) {
+      filesInDirectory.emplace_back(absolutePath);
+    } else {
+      if(ls_std::File::_isFile(absolutePath)) {
+        filesInDirectory.emplace_back(absolutePath);
+      }
+    }
   }
 
   return filesInDirectory;
@@ -257,17 +291,26 @@ std::list<std::string> ls_std::File::_listUnix(const std::string &_path)
 #endif
 
 #ifdef _WIN32
-std::list<std::string> ls_std::File::_listWindows(const std::string &_path)
+std::list<std::string> ls_std::File::_listWindows(const std::string &_path, bool withDirectories)
 {
   std::list<std::string> filesInDirectory {};
   WIN32_FIND_DATA data {};
   HANDLE hFind;
   std::string parent = ls_std::File::_getParent(_path);
   std::string pattern {_path + ls_std::FilePathSeparator::getOperatingSystemSpecificSeparator() + "*"};
+  std::string absolutePath {};
 
   if((hFind = FindFirstFile(pattern.c_str(), &data)) != INVALID_HANDLE_VALUE) {
     do {
-      filesInDirectory.emplace_back(parent + data.cFileName);
+      absolutePath = parent + data.cFileName;
+
+      if(withDirectories) {
+        filesInDirectory.emplace_back(absolutePath);
+      } else {
+        if(ls_std::File::_isFile(absolutePath)) {
+          filesInDirectory.emplace_back(absolutePath);
+        }
+      }
     }
     while(FindNextFile(hFind, &data) != 0);
 

+ 4 - 2
source/io/File.hpp

@@ -41,6 +41,7 @@ namespace ls_std {
       bool isFile();
       time_t lastModified();
       std::list<std::string> list();
+      std::list<std::string> listFiles();
       void makeDirectory();
       void makeDirectories();
       void remove();
@@ -55,11 +56,12 @@ namespace ls_std {
       static bool _isFile(const std::string& _path);
       static time_t _lastModified(const std::string& _path);
       static std::list<std::string> _list(const std::string& _path);
+      static std::list<std::string> _listFiles(const std::string& _path);
       #if defined(unix) || defined(__APPLE__)
-        static std::list<std::string> _listUnix(const std::string& _path);
+        static std::list<std::string> _listUnix(const std::string& _path, bool withDirectories);
       #endif
       #ifdef _WIN32
-        static std::list<std::string> _listWindows(const std::string& _path);
+        static std::list<std::string> _listWindows(const std::string& _path, bool withDirectories);
       #endif
       static int _mkdir(const std::string& _path);
       static std::string _normalizePath(std::string _path);

+ 21 - 0
test/cases/io/FileTest.cpp

@@ -191,6 +191,27 @@ namespace {
     ASSERT_TRUE((ls_std::STLUtils<std::list<std::string>, std::string>::contains(filesInDirectory, expectedFile)));
   }
 
+  TEST_F(FileTest, listFiles)
+  {
+    ls_std::File file {TestHelper::getResourcesFolderLocation() + "list_test"};
+    std::list<std::string> filesInDirectory = file.listFiles();
+    std::string expectedFile {};
+
+    auto filesIterator = filesInDirectory.begin();
+
+    ASSERT_FALSE(filesInDirectory.empty());
+    ASSERT_EQ(4, filesInDirectory.size());
+
+    expectedFile = file.getParent() + "another_file.txt";
+    ASSERT_TRUE((ls_std::STLUtils<std::list<std::string>, std::string>::contains(filesInDirectory, expectedFile)));
+    expectedFile = file.getParent() + "bla.txt";
+    ASSERT_TRUE((ls_std::STLUtils<std::list<std::string>, std::string>::contains(filesInDirectory, expectedFile)));
+    expectedFile = file.getParent() + "hello.txt";
+    ASSERT_TRUE((ls_std::STLUtils<std::list<std::string>, std::string>::contains(filesInDirectory, expectedFile)));
+    expectedFile = file.getParent() + ".hidden_file.txt";
+    ASSERT_TRUE((ls_std::STLUtils<std::list<std::string>, std::string>::contains(filesInDirectory, expectedFile)));
+  }
+
   TEST_F(FileTest, makeDirectory)
   {
     ls_std::File directory {TestHelper::getResourcesFolderLocation() + "testDir"};