1
0

Start find directory

This commit is contained in:
Scott E. Graves
2017-03-03 00:11:03 -06:00
parent 77f5c6797d
commit aa7999393d
3 changed files with 59 additions and 2 deletions

View File

@@ -104,6 +104,8 @@ public:
std::shared_ptr<_CSiaFile> GetFile(const String& siaPath) const;
std::vector<String> QueryDirectories(String query) const;
bool FileExists(const String& siaPath) const;
};

View File

@@ -52,14 +52,39 @@ CSiaFilePtr CSiaApi::_CSiaFileTree::GetFile(const String& siaPath) const
CSiaFileCollection CSiaApi::_CSiaFileTree::Query(String query) const
{
query = CSiaApi::FormatToSiaPath(query);
ReplaceStringInPlace(ReplaceStringInPlace(ReplaceStringInPlace(query, L".", L"\\."), L"*", L".+"), L"?", L".?");
ReplaceStringInPlace(ReplaceStringInPlace(ReplaceStringInPlace(query, L".", L"\\."), L"*", L"[^/]+"), L"?", L"[^/]?");
std::wregex r(query);
CSiaFileCollection ret;
std::copy_if(_fileList.begin(), _fileList.end(), std::back_inserter(ret), [&](const CSiaFilePtr& v) -> bool
std::copy_if(_fileList.begin(), _fileList.end(), std::back_inserter(ret), [&](const CSiaFilePtr& v) -> bool
{
return std::regex_match(v->GetSiaPath(), r);
});
return std::move(ret);
}
std::vector<String> CSiaApi::_CSiaFileTree::QueryDirectories(String query) const
{
query = CSiaApi::FormatToSiaPath(query);
ReplaceStringInPlace(ReplaceStringInPlace(ReplaceStringInPlace(query, L".", L"\\."), L"*", L"[^/]+"), L"?", L"[^/]?");
std::wregex r(query);
std::vector<String> ret;
std::for_each(_fileList.begin(), _fileList.end(), [&](const CSiaFilePtr& v)
{
String dir = v->GetSiaPath();
int pos = dir.find_last_of('/');
if (pos > -1)
{
pos = dir.find_first_of('/');
dir = dir.substr(0, pos);
if (std::find(ret.begin(), ret.end(), dir) == ret.end())
{
ret.push_back(dir);
}
}
});
return std::move(ret);
}

View File

@@ -352,11 +352,41 @@ private:
if (siaFileTree)
{
String siaQuery = CSiaApi::FormatToSiaPath(PathSkipRoot(FileName));
String dirQuery = siaQuery;
if (::PathIsDirectory(FileName))
{
siaQuery += L"/*.*";
dirQuery = siaQuery;
}
else
{
String dir = FileName;
::PathRemoveFileSpec(&dir[0]);
dirQuery = dir + L"/*.*";
}
auto dirList = siaFileTree->QueryDirectories(dirQuery);
for (auto& dir : dirList)
{
WIN32_FIND_DATA fd = { 0 };
wcscpy_s(fd.cFileName, dir.c_str());
fd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
FillFindData(&fd, DokanFileInfo);
}
auto fileList = siaFileTree->Query(siaQuery);
for (auto& file : fileList)
{
WIN32_FIND_DATA fd = { 0 };
wcscpy_s(fd.cFileName, PathFindFileName(file->GetSiaPath().c_str()));
LARGE_INTEGER li = { 0 };
li.QuadPart = file->GetFileSize();
fd.nFileSizeHigh = li.HighPart;
fd.nFileSizeLow = li.LowPart;
fd.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_NORMAL;
FillFindData(&fd, DokanFileInfo);
}