【发布时间】:2010-11-30 22:12:35
【问题描述】:
我编写了一个使用 WIN32 api 来创建临时目录层次结构的应用程序。现在,当想要在关闭应用程序时删除目录时,我遇到了一些问题。
假设我有一个目录层次结构:C:\temp\directory\subdirectory\
我正在使用这个递归函数:
bool Dir::deleteDirectory(std::string& directoryname, int flags)
{
if(directoryname.at(directoryname.size()-1) != '\\') directoryname += '\\';
if ((flags & CONTENTS) == CONTENTS)
{
WIN32_FIND_DATAA fdata;
HANDLE dhandle;
directoryname += "\\*";
dhandle = FindFirstFileA(directoryname.c_str(), &fdata);
// Loop through all the files in the main directory and delete files & make a list of directories
while(true)
{
if(FindNextFileA(dhandle, &fdata))
{
std::string filename = fdata.cFileName;
if(filename.compare("..") != 0)
{
std::string filelocation = directoryname.substr(0, directoryname.size()-2) + StringManip::reverseSlashes(filename);
// If we've encountered a directory then recall this function for that specific folder.
if(!isDirectory(filelocation)) DeleteFileA(filename.c_str());
else deleteDirectory(filelocation, DIRECTORY_AND_CONTENTS);
}
} else if(GetLastError() == ERROR_NO_MORE_FILES) break;
}
directoryname = directoryname.substr(0, directoryname.size()-2);
}
if ((flags & DIRECTORY) == DIRECTORY)
{
HANDLE DirectoryHandle;
DirectoryHandle = CreateFileA(directoryname.c_str(),
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL);
bool DeletionResult = (RemoveDirectoryA(directoryname.c_str()) != 0)?true:false;
CloseHandle(DirectoryHandle);
return DeletionResult;
}
return true;
}
这个函数遍历临时目录的目录内容;并且对于临时目录中的每个目录,它都会不断地回忆自己,直到它位于最低目录;示例中的子目录。
还定义了 3 个标志
enum DirectoryDeletion
{
CONTENTS = 0x1,
DIRECTORY = 0x2,
DIRECTORY_AND_CONTENTS = (0x1 | 0x2)
};
使用此功能时,它只删除最低的子目录,我无法删除层次较高的子目录,因为它说目录不为空。当我去查看目录时,“子目录”仅在应用程序结束后被删除。但是,当我尝试将其封装在一个非递归的简单主应用程序中时,删除目录完全没有问题。
【问题讨论】:
-
当我阅读您的主题行时,我以为您正在尝试删除 win32 目录...
标签: c++ winapi recursion directory