diff --git a/src/siadrive_api/siafiletree.cpp b/src/siadrive_api/siafiletree.cpp index 551106b..4b193ed 100644 --- a/src/siadrive_api/siafiletree.cpp +++ b/src/siadrive_api/siafiletree.cpp @@ -74,6 +74,8 @@ std::vector CSiaApi::_CSiaFileTree::QueryDirectories(SString rootFolder auto fileList = GetFileList(); CSiaFileCollection col; rootFolder.Replace("/", "\\"); + if (!rootFolder.BeginsWith('\\')) + rootFolder = '\\' + rootFolder; std::vector ret; std::for_each(fileList->begin(), fileList->end(), [&](const CSiaFilePtr& v) @@ -81,7 +83,7 @@ std::vector CSiaApi::_CSiaFileTree::QueryDirectories(SString rootFolder SString path = ("\\" + FilePath(v->GetSiaPath()).RemoveFileName()).Replace("/", "\\"); if (path.BeginsWith(rootFolder)) { - path = (rootFolder == "\\") ? path.SubString(1) : path.SubString(1, rootFolder.Length()); + path = (rootFolder == "\\") ? path.SubString(1) : path.SubString(rootFolder.Length() + 1); if (path.Length()) { auto splitPaths = path.Split('\\'); diff --git a/src/siadrive_dokan_api/siadokandrive.cpp b/src/siadrive_dokan_api/siadokandrive.cpp index f155f91..550ecb5 100644 --- a/src/siadrive_dokan_api/siadokandrive.cpp +++ b/src/siadrive_dokan_api/siadokandrive.cpp @@ -1471,6 +1471,13 @@ private: } } } + else if (createDisposition == OPEN_EXISTING) + { + if (!cacheFilePath.IsDirectory()) + { + ret = STATUS_NOT_FOUND; + } + } if (ret == STATUS_SUCCESS) { @@ -1715,8 +1722,8 @@ private: findFile.Append(fileName); if (dokanFileInfo->IsDirectory) { + siaDirQuery = siaFileQuery; siaFileQuery += L"/*.*"; - siaDirQuery = findFile; findFile.Append("*"); } } @@ -2272,7 +2279,7 @@ private: // if open with FILE_FLAG_DELETE_ON_CLOSE if (dokanFileInfo->IsDirectory) { - filePath.RemoveDirectory(); + while (!filePath.RemoveDirectory()); } else { @@ -2337,13 +2344,10 @@ private: } } while ((ret == STATUS_SUCCESS) && (::FindNextFile(findHandle, &findData) != 0)); - if (ret != STATUS_DIRECTORY_NOT_EMPTY) + DWORD error = ::GetLastError(); + if ((ret != STATUS_DIRECTORY_NOT_EMPTY) && (error != ERROR_NO_MORE_FILES)) { - DWORD error = ::GetLastError(); - if (error != ERROR_NO_MORE_FILES) - { - ret = DokanNtStatusFromWin32(error); - } + ret = DokanNtStatusFromWin32(error); } ::FindClose(findHandle);