added wxPATH_RMDIR_FULL/RECURSIVE wxFileName::Rmdir() flags (closes #10422)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58385 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2009-01-25 12:37:16 +00:00
parent 2ddb8ccf60
commit 110c50944f
3 changed files with 125 additions and 12 deletions

View File

@ -87,12 +87,19 @@ enum
wxPATH_GET_SEPARATOR = 0x0002 // terminate the path with the separator
};
// MkDir flags
// Mkdir flags
enum
{
wxPATH_MKDIR_FULL = 0x0001 // create directories recursively
};
// Rmdir flags
enum
{
wxPATH_RMDIR_FULL = 0x0001, // delete with subdirectories if empty
wxPATH_RMDIR_RECURSIVE = 0x0002 // delete all recursively (dangerous!)
};
#if wxUSE_LONGLONG
// error code of wxFileName::GetSize()
extern WXDLLIMPEXP_DATA_BASE(const wxULongLong) wxInvalidSize;
@ -309,11 +316,12 @@ public:
#endif // wxUSE_FFILE
// directory creation and removal.
bool Mkdir( int perm = wxS_DIR_DEFAULT, int flags = 0);
static bool Mkdir( const wxString &dir, int perm = wxS_DIR_DEFAULT, int flags = 0 );
bool Mkdir(int perm = wxS_DIR_DEFAULT, int flags = 0);
static bool Mkdir(const wxString &dir, int perm = wxS_DIR_DEFAULT,
int flags = 0);
bool Rmdir();
static bool Rmdir( const wxString &dir );
bool Rmdir(int flags = 0);
static bool Rmdir(const wxString &dir, int flags = 0);
// operations on the path

View File

@ -53,6 +53,24 @@ enum wxPathNormalize
wxPATH_NORM_ALL = 0x00ff & ~wxPATH_NORM_CASE
};
/**
Flags for wxFileName::Rmdir().
*/
enum
{
/// Delete the specified directory and its subdirectories if they are empty.
wxPATH_RMDIR_FULL = 1,
/**
Delete the specified directory and all the files and subdirectories in it
recursively.
This flag is obviously @b dangerous and should be used with care and
after asking the user for confirmation.
*/
wxPATH_RMDIR_RECURSIVE = 2
};
/**
The return value of wxFileName::GetSize() in case of error.
*/
@ -982,13 +1000,31 @@ public:
/**
Deletes the specified directory from the file system.
@param flags
Can contain one of wxPATH_RMDIR_FULL or wxPATH_RMDIR_RECURSIVE. By
default contains neither so the directory will not be removed
unless it is empty.
@return Returns @true if the directory was successfully deleted, @false
otherwise.
*/
bool Rmdir();
bool Rmdir(int flags = 0);
/**
Deletes the specified directory from the file system.
@param dir
The directory to delete
@param flags
Can contain one of wxPATH_RMDIR_FULL or wxPATH_RMDIR_RECURSIVE. By
default contains neither so the directory will not be removed
unless it is empty.
@return Returns @true if the directory was successfully deleted, @false
otherwise.
*/
static bool Rmdir(const wxString& dir);
static bool Rmdir(const wxString& dir, int flags = 0);
/**
Compares the filename using the rules of this platform.
@ -1140,4 +1176,3 @@ public:
*/
wxFileName& operator=(const wxString& filename);
};

View File

@ -83,6 +83,7 @@
#include "wx/tokenzr.h"
#include "wx/config.h" // for wxExpandEnvVars
#include "wx/dynlib.h"
#include "wx/dir.h"
#if defined(__WIN32__) && defined(__MINGW32__)
#include "wx/msw/gccpriv.h"
@ -1123,14 +1124,83 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags )
return ::wxMkdir( dir, perm );
}
bool wxFileName::Rmdir()
bool wxFileName::Rmdir(int flags)
{
return wxFileName::Rmdir( GetPath() );
return wxFileName::Rmdir( GetPath(), flags );
}
bool wxFileName::Rmdir( const wxString &dir )
bool wxFileName::Rmdir(const wxString& dir, int flags)
{
return ::wxRmdir( dir );
#ifdef __WXMSW__
if ( flags & wxPATH_RMDIR_RECURSIVE )
{
// SHFileOperation needs double null termination string
// but without separator at the end of the path
wxString path(dir);
if ( path.Last() == wxFILE_SEP_PATH )
path.RemoveLast();
path += _T('\0');
SHFILEOPSTRUCT fileop;
wxZeroMemory(fileop);
fileop.wFunc = FO_DELETE;
fileop.pFrom = path.fn_str();
fileop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
#ifndef __WXWINCE__
// FOF_NOERRORUI is not defined in WinCE
fileop.fFlags |= FOF_NOERRORUI;
#endif
int ret = SHFileOperation(&fileop);
if ( ret != 0 )
{
// SHFileOperation may return non-Win32 error codes, so the error
// message can be incorrect
wxLogApiError(_T("SHFileOperation"), ret);
return false;
}
return true;
}
else if ( flags & wxPATH_RMDIR_FULL )
#else // !__WXMSW__
if ( flags != 0 ) // wxPATH_RMDIR_FULL or wxPATH_RMDIR_RECURSIVE
#endif // !__WXMSW__
{
wxString path(dir);
if ( path.Last() != wxFILE_SEP_PATH )
path += wxFILE_SEP_PATH;
wxDir d(path);
if ( !d.IsOpened() )
return false;
wxString filename;
// first delete all subdirectories
bool cont = d.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
while ( cont )
{
wxFileName::Rmdir(path + filename, flags);
cont = d.GetNext(&filename);
}
#ifndef __WXMSW__
if ( flags & wxPATH_RMDIR_RECURSIVE )
{
// delete all files too
cont = d.GetFirst(&filename, "", wxDIR_FILES | wxDIR_HIDDEN);
while ( cont )
{
::wxRemoveFile(path + filename);
cont = d.GetNext(&filename);
}
}
#endif // !__WXMSW__
}
return ::wxRmdir(dir);
}
// ----------------------------------------------------------------------------