From 19ce3bf69b3ffa7d72e0c3cbfcfb961506f5a49e Mon Sep 17 00:00:00 2001 From: Andrey Prygunkov Date: Mon, 21 Dec 2015 20:54:21 +0100 Subject: [PATCH] #130: improved class DirBrowser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It doesn’t return filenames ‘.’ and ‘..’ (for current and parent directories) anymore, eliminating the need to check and ignore these names on each usage of the class. --- daemon/postprocess/Cleanup.cpp | 29 ++++++++--------- daemon/postprocess/DupeMatcher.cpp | 29 ++++++++--------- daemon/postprocess/ParChecker.cpp | 5 ++- daemon/postprocess/ParRenamer.cpp | 4 +-- daemon/postprocess/Unpack.cpp | 51 +++++++++++++----------------- daemon/queue/Scanner.cpp | 2 +- daemon/util/Util.cpp | 19 ++++++++--- daemon/util/Util.h | 3 +- tests/suite/TestUtil.cpp | 9 ++---- 9 files changed, 72 insertions(+), 79 deletions(-) diff --git a/daemon/postprocess/Cleanup.cpp b/daemon/postprocess/Cleanup.cpp index b963b5eb..e9472683 100644 --- a/daemon/postprocess/Cleanup.cpp +++ b/daemon/postprocess/Cleanup.cpp @@ -94,23 +94,20 @@ bool MoveController::MoveFiles() DirBrowser dir(m_interDir); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..")) + BString<1024> srcFile("%s%c%s",* m_interDir, PATH_SEPARATOR, filename); + CString dstFile = Util::MakeUniqueFilename(m_destDir, filename); + bool hiddenFile = filename[0] == '.'; + + if (!hiddenFile) { - BString<1024> srcFile("%s%c%s",* m_interDir, PATH_SEPARATOR, filename); - CString dstFile = Util::MakeUniqueFilename(m_destDir, filename); - bool hiddenFile = filename[0] == '.'; + PrintMessage(Message::mkInfo, "Moving file %s to %s", Util::BaseFileName(srcFile), *m_destDir); + } - if (!hiddenFile) - { - PrintMessage(Message::mkInfo, "Moving file %s to %s", Util::BaseFileName(srcFile), *m_destDir); - } - - if (!Util::MoveFile(srcFile, dstFile) && !hiddenFile) - { - PrintMessage(Message::mkError, "Could not move file %s to %s: %s", - *srcFile, *dstFile, *Util::GetLastErrorMessage()); - ok = false; - } + if (!Util::MoveFile(srcFile, dstFile) && !hiddenFile) + { + PrintMessage(Message::mkError, "Could not move file %s to %s: %s", + *srcFile, *dstFile, *Util::GetLastErrorMessage()); + ok = false; } } @@ -210,7 +207,7 @@ bool CleanupController::Cleanup(const char* destDir, bool *deleted) bool isDir = Util::DirectoryExists(fullFilename); - if (strcmp(filename, ".") && strcmp(filename, "..") && isDir) + if (isDir) { ok &= Cleanup(fullFilename, deleted); } diff --git a/daemon/postprocess/DupeMatcher.cpp b/daemon/postprocess/DupeMatcher.cpp index 25be9512..d913be5e 100644 --- a/daemon/postprocess/DupeMatcher.cpp +++ b/daemon/postprocess/DupeMatcher.cpp @@ -212,24 +212,21 @@ void DupeMatcher::FindLargestFile(const char* directory, char* filenameBuf, int DirBrowser dir(directory); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..")) + BString<1024> fullFilename("%s%c%s", directory, PATH_SEPARATOR, filename); + + int64 fileSize = Util::FileSize(fullFilename); + if (fileSize > *maxSize) { - BString<1024> fullFilename("%s%c%s", directory, PATH_SEPARATOR, filename); + *maxSize = fileSize; + strncpy(filenameBuf, filename, bufLen); + filenameBuf[bufLen-1] = '\0'; + } - int64 fileSize = Util::FileSize(fullFilename); - if (fileSize > *maxSize) - { - *maxSize = fileSize; - strncpy(filenameBuf, filename, bufLen); - filenameBuf[bufLen-1] = '\0'; - } - - if (Util::MatchFileExt(filename, ".rar", ",")) - { - RarLister::FindLargestFile(this, directory, filenameBuf, bufLen, - m_maxSize, 60, maxSize, compressed); - return; - } + if (Util::MatchFileExt(filename, ".rar", ",")) + { + RarLister::FindLargestFile(this, directory, filenameBuf, bufLen, + m_maxSize, 60, maxSize, compressed); + return; } } } diff --git a/daemon/postprocess/ParChecker.cpp b/daemon/postprocess/ParChecker.cpp index d255a980..743299a1 100644 --- a/daemon/postprocess/ParChecker.cpp +++ b/daemon/postprocess/ParChecker.cpp @@ -852,8 +852,7 @@ bool ParChecker::AddSplittedFragments() DirBrowser dir(m_destDir); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..") && strcmp(filename, "_brokenlog.txt") && - !IsParredFile(filename) && !IsProcessedFile(filename)) + if (strcmp(filename, "_brokenlog.txt") && !IsParredFile(filename) && !IsProcessedFile(filename)) { for (std::vector::iterator it = ((Repairer*)m_repairer)->sourcefiles.begin(); it != ((Repairer*)m_repairer)->sourcefiles.end(); it++) @@ -963,7 +962,7 @@ bool ParChecker::AddExtraFiles(bool onlyMissing, bool externalDir, const char* d DirBrowser dir(directory); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..") && strcmp(filename, "_brokenlog.txt") && + if (strcmp(filename, "_brokenlog.txt") && (externalDir || (!IsParredFile(filename) && !IsProcessedFile(filename)))) { BString<1024> fullfilename("%s%c%s", directory, PATH_SEPARATOR, filename); diff --git a/daemon/postprocess/ParRenamer.cpp b/daemon/postprocess/ParRenamer.cpp index eeb21288..bdfba727 100644 --- a/daemon/postprocess/ParRenamer.cpp +++ b/daemon/postprocess/ParRenamer.cpp @@ -152,7 +152,7 @@ void ParRenamer::BuildDirList(const char* destDir) while (const char* filename = dirBrowser->Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..") && !m_cancelled) + if (!m_cancelled) { BString<1024> fullFilename("%s%c%s", destDir, PATH_SEPARATOR, filename); if (Util::DirectoryExists(fullFilename)) @@ -221,7 +221,7 @@ void ParRenamer::CheckFiles(const char* destDir, bool renamePars) DirBrowser dir(destDir); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..") && !m_cancelled) + if (!m_cancelled) { BString<1024> fullFilename("%s%c%s", destDir, PATH_SEPARATOR, filename); diff --git a/daemon/postprocess/Unpack.cpp b/daemon/postprocess/Unpack.cpp index 6310ceee..2d4d5a41 100644 --- a/daemon/postprocess/Unpack.cpp +++ b/daemon/postprocess/Unpack.cpp @@ -419,15 +419,13 @@ void UnpackController::JoinSplittedFiles() { BString<1024> fullFilename("%s%c%s", *m_destDir, PATH_SEPARATOR, filename); - if (strcmp(filename, ".") && strcmp(filename, "..") && !Util::DirectoryExists(fullFilename)) + if (!Util::DirectoryExists(fullFilename) && + regExSplitExt.Match(filename) && !FileHasRarSignature(fullFilename)) { - if (regExSplitExt.Match(filename) && !FileHasRarSignature(fullFilename)) + if (!JoinFile(filename)) { - if (!JoinFile(filename)) - { - m_unpackOk = false; - break; - } + m_unpackOk = false; + break; } } } @@ -465,8 +463,7 @@ bool UnpackController::JoinFile(const char* fragBaseName) { fullFilename.Format("%s%c%s", *m_destDir, PATH_SEPARATOR, filename); - if (strcmp(filename, ".") && strcmp(filename, "..") && !Util::DirectoryExists(fullFilename) && - regExSplitExt.Match(filename)) + if (!Util::DirectoryExists(fullFilename) && regExSplitExt.Match(filename)) { const char* segExt = strrchr(filename, '.'); int segNum = atoi(segExt + 1); @@ -661,7 +658,7 @@ void UnpackController::CheckArchiveFiles(bool scanNonStdFiles) { BString<1024> fullFilename("%s%c%s", *m_destDir, PATH_SEPARATOR, filename); - if (strcmp(filename, ".") && strcmp(filename, "..") && !Util::DirectoryExists(fullFilename)) + if (!Util::DirectoryExists(fullFilename)) { const char* ext = strchr(filename, '.'); int extNum = ext ? atoi(ext + 1) : -1; @@ -732,25 +729,22 @@ bool UnpackController::Cleanup() DirBrowser dir(m_unpackDir); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..")) + BString<1024> srcFile("%s%c%s", *m_unpackDir, PATH_SEPARATOR, filename); + BString<1024> dstFile("%s%c%s", !m_finalDir.Empty() ? *m_finalDir : *m_destDir, PATH_SEPARATOR, filename); + + // silently overwrite existing files + remove(dstFile); + + bool hiddenFile = filename[0] == '.'; + + if (!Util::MoveFile(srcFile, dstFile) && !hiddenFile) { - BString<1024> srcFile("%s%c%s", *m_unpackDir, PATH_SEPARATOR, filename); - BString<1024> dstFile("%s%c%s", !m_finalDir.Empty() ? *m_finalDir : *m_destDir, PATH_SEPARATOR, filename); - - // silently overwrite existing files - remove(dstFile); - - bool hiddenFile = filename[0] == '.'; - - if (!Util::MoveFile(srcFile, dstFile) && !hiddenFile) - { - PrintMessage(Message::mkError, "Could not move file %s to %s: %s", *srcFile, *dstFile, - *Util::GetLastErrorMessage()); - ok = false; - } - - extractedFiles.push_back(filename); + PrintMessage(Message::mkError, "Could not move file %s to %s: %s", *srcFile, *dstFile, + *Util::GetLastErrorMessage()); + ok = false; } + + extractedFiles.push_back(filename); } } @@ -780,8 +774,7 @@ bool UnpackController::Cleanup() { BString<1024> fullFilename("%s%c%s", *m_destDir, PATH_SEPARATOR, filename); - if (strcmp(filename, ".") && strcmp(filename, "..") && - !Util::DirectoryExists(fullFilename) && + if (!Util::DirectoryExists(fullFilename) && (m_interDir || !extractedFiles.Exists(filename)) && (regExRar.Match(filename) || regExSevenZip.Match(filename) || (regExRarMultiSeq.Match(filename) && FileHasRarSignature(fullFilename)) || diff --git a/daemon/queue/Scanner.cpp b/daemon/queue/Scanner.cpp index 9a52cd5a..25cf4a5b 100644 --- a/daemon/queue/Scanner.cpp +++ b/daemon/queue/Scanner.cpp @@ -187,7 +187,7 @@ void Scanner::CheckIncomingNzbs(const char* directory, const char* category, boo BString<1024> fullfilename("%s%s", directory, filename); bool isDirectory = Util::DirectoryExists(fullfilename); // check subfolders - if (isDirectory && strcmp(filename, ".") && strcmp(filename, "..")) + if (isDirectory) { fullfilename[strlen(fullfilename) + 1] = '\0'; fullfilename.AppendFmt("%c", PATH_SEPARATOR); diff --git a/daemon/util/Util.cpp b/daemon/util/Util.cpp index 76b3f6a7..37329f21 100644 --- a/daemon/util/Util.cpp +++ b/daemon/util/Util.cpp @@ -124,7 +124,7 @@ DirBrowser::~DirBrowser() } } -const char* DirBrowser::Next() +const char* DirBrowser::InternNext() { bool ok = false; if (m_first) @@ -184,12 +184,12 @@ DirBrowser::~DirBrowser() { if (m_dir) { - closedir((DIR*)m_dir); + closedir(m_dir); } } } -const char* DirBrowser::Next() +const char* DirBrowser::InternNext() { #ifdef DIRBROWSER_SNAPSHOT if (m_snapshot) @@ -201,7 +201,7 @@ const char* DirBrowser::Next() { if (m_dir) { - m_findData = readdir((DIR*)m_dir); + m_findData = readdir(m_dir); if (m_findData) { return m_findData->d_name; @@ -210,9 +210,18 @@ const char* DirBrowser::Next() return NULL; } } - #endif +const char* DirBrowser::Next() +{ + const char* filename = NULL; + for (filename = InternNext(); filename && (!strcmp(filename, ".") || !strcmp(filename, "..")); ) + { + filename = InternNext(); + } + return filename; +} + char Util::VersionRevisionBuf[100]; diff --git a/daemon/util/Util.h b/daemon/util/Util.h index 59a3f64d..f82deea4 100644 --- a/daemon/util/Util.h +++ b/daemon/util/Util.h @@ -42,7 +42,7 @@ private: HANDLE m_file; bool m_first; #else - void* m_dir; // DIR*, declared as void* to avoid including of + DIR* m_dir; struct dirent* m_findData; #endif @@ -53,6 +53,7 @@ private: FileList::iterator m_itSnapshot; #endif + const char* InternNext(); public: #ifdef DIRBROWSER_SNAPSHOT DirBrowser(const char* path, bool snapshot = true); diff --git a/tests/suite/TestUtil.cpp b/tests/suite/TestUtil.cpp index 71a5c693..ea68f652 100644 --- a/tests/suite/TestUtil.cpp +++ b/tests/suite/TestUtil.cpp @@ -114,12 +114,9 @@ void TestUtil::CopyAllFiles(const std::string destDir, const std::string srcDir) DirBrowser dir(srcDir.c_str()); while (const char* filename = dir.Next()) { - if (strcmp(filename, ".") && strcmp(filename, "..")) - { - std::string srcFile(srcDir + "/" + filename); - std::string dstFile(destDir + "/" + filename); - REQUIRE(Util::CopyFile(srcFile.c_str(), dstFile.c_str())); - } + std::string srcFile(srcDir + "/" + filename); + std::string dstFile(destDir + "/" + filename); + REQUIRE(Util::CopyFile(srcFile.c_str(), dstFile.c_str())); } }