diff options
author | Dennis Syrovatsky <dennis@tightvnc.com> | 2005-10-19 10:05:51 +0000 |
---|---|---|
committer | Dennis Syrovatsky <dennis@tightvnc.com> | 2005-10-19 10:05:51 +0000 |
commit | 880318bf63d7640764ecd5639c7aadef952fd118 (patch) | |
tree | b0688eb597511c77c55caeb2832c7969b895b3d9 /rfb_win32 | |
parent | 84ea20fbd67d760b1fb214cb4413258ecf8b24bd (diff) | |
download | tigervnc-880318bf63d7640764ecd5639c7aadef952fd118.tar.gz tigervnc-880318bf63d7640764ecd5639c7aadef952fd118.zip |
Added routines for deleteDir method in FolderManager class.
Changed flag for folder identification.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@354 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'rfb_win32')
-rw-r--r-- | rfb_win32/FolderManager.cxx | 58 | ||||
-rw-r--r-- | rfb_win32/FolderManager.h | 2 |
2 files changed, 57 insertions, 3 deletions
diff --git a/rfb_win32/FolderManager.cxx b/rfb_win32/FolderManager.cxx index 7cba7b51..d554cbb0 100644 --- a/rfb_win32/FolderManager.cxx +++ b/rfb_win32/FolderManager.cxx @@ -55,7 +55,59 @@ FolderManager::renameDir(char *pOldName, char *pNewName) bool FolderManager::deleteDir(char *pFullPath) { - return false; + FileInfo fileInfo; + fileInfo.add(pFullPath, 0, 0, FT_ATTR_DIR); + + unsigned int num = fileInfo.getNumEntries(); + unsigned int last = num - 1; + + while (num > 0) { + if (fileInfo.getFlagsAt(last) & FT_ATTR_DIR) { + if (RemoveDirectory(fileInfo.getNameAt(last)) == 0) { + if (GetLastError() == ERROR_DIR_NOT_EMPTY) { + if (!getFolderInfoWithPrefix(fileInfo.getNameAt(last), &fileInfo)) { + fileInfo.free(); + return false; + } + } + } else { + fileInfo.deleteAt(last); + } + } else { + if (DeleteFile(fileInfo.getNameAt(last)) == 0) { + fileInfo.free(); + return false; + } else { + fileInfo.deleteAt(last); + } + } + + num = fileInfo.getNumEntries(); + last = num - 1; + } + + return true; +} + +bool +FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo) +{ + char prefix[FT_FILENAME_SIZE]; + strcpy(prefix, pPrefix); + + FileInfo tmpFileInfo; + if (!getFolderInfo(prefix, &tmpFileInfo, 0)) { + tmpFileInfo.free(); + return false; + } else { + char buf[FT_FILENAME_SIZE]; + for (unsigned int i = 0; i < tmpFileInfo.getNumEntries(); i++) { + sprintf(buf, "%s\\%s", prefix, tmpFileInfo.getNameAt(i)); + pFileInfo->add(buf, tmpFileInfo.getSizeAt(i), tmpFileInfo.getDataAt(i), tmpFileInfo.getFlagsAt(i)); + } + } + tmpFileInfo.free(); + return true; } bool @@ -81,7 +133,7 @@ FolderManager::getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirO li.HighPart = FindFileData.ftLastWriteTime.dwHighDateTime; li.QuadPart = (li.QuadPart - 116444736000000000) / 10000000; if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - pFileInfo->add(FindFileData.cFileName, 0, li.LowPart, FT_ATTR_FOLDER); + pFileInfo->add(FindFileData.cFileName, 0, li.LowPart, FT_ATTR_DIR); } else { if (!dirOnly) pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, li.LowPart, FT_ATTR_FILE); @@ -109,7 +161,7 @@ FolderManager::getDrivesInfo(FileInfo *pFileInfo) char *backslash = strrchr(drive, '\\'); if (backslash != NULL) *backslash = '\0'; - pFileInfo->add(drive, 0, 0, FT_ATTR_FOLDER); + pFileInfo->add(drive, 0, 0, FT_ATTR_DIR); free(drive); i += strcspn(&szDrivesList[i], "\0") + 1; } diff --git a/rfb_win32/FolderManager.h b/rfb_win32/FolderManager.h index 15aa238f..6f1839d0 100644 --- a/rfb_win32/FolderManager.h +++ b/rfb_win32/FolderManager.h @@ -42,6 +42,8 @@ namespace rfb { bool getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly); bool getDrivesInfo(FileInfo *pFI); + private: + bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo); }; } } |