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:
@@ -87,12 +87,19 @@ enum
|
|||||||
wxPATH_GET_SEPARATOR = 0x0002 // terminate the path with the separator
|
wxPATH_GET_SEPARATOR = 0x0002 // terminate the path with the separator
|
||||||
};
|
};
|
||||||
|
|
||||||
// MkDir flags
|
// Mkdir flags
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
wxPATH_MKDIR_FULL = 0x0001 // create directories recursively
|
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
|
#if wxUSE_LONGLONG
|
||||||
// error code of wxFileName::GetSize()
|
// error code of wxFileName::GetSize()
|
||||||
extern WXDLLIMPEXP_DATA_BASE(const wxULongLong) wxInvalidSize;
|
extern WXDLLIMPEXP_DATA_BASE(const wxULongLong) wxInvalidSize;
|
||||||
@@ -309,11 +316,12 @@ public:
|
|||||||
#endif // wxUSE_FFILE
|
#endif // wxUSE_FFILE
|
||||||
|
|
||||||
// directory creation and removal.
|
// directory creation and removal.
|
||||||
bool Mkdir( 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 );
|
static bool Mkdir(const wxString &dir, int perm = wxS_DIR_DEFAULT,
|
||||||
|
int flags = 0);
|
||||||
|
|
||||||
bool Rmdir();
|
bool Rmdir(int flags = 0);
|
||||||
static bool Rmdir( const wxString &dir );
|
static bool Rmdir(const wxString &dir, int flags = 0);
|
||||||
|
|
||||||
// operations on the path
|
// operations on the path
|
||||||
|
|
||||||
|
@@ -53,6 +53,24 @@ enum wxPathNormalize
|
|||||||
wxPATH_NORM_ALL = 0x00ff & ~wxPATH_NORM_CASE
|
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.
|
The return value of wxFileName::GetSize() in case of error.
|
||||||
*/
|
*/
|
||||||
@@ -982,13 +1000,31 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Deletes the specified directory from the file system.
|
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.
|
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.
|
Compares the filename using the rules of this platform.
|
||||||
@@ -1140,4 +1176,3 @@ public:
|
|||||||
*/
|
*/
|
||||||
wxFileName& operator=(const wxString& filename);
|
wxFileName& operator=(const wxString& filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -83,6 +83,7 @@
|
|||||||
#include "wx/tokenzr.h"
|
#include "wx/tokenzr.h"
|
||||||
#include "wx/config.h" // for wxExpandEnvVars
|
#include "wx/config.h" // for wxExpandEnvVars
|
||||||
#include "wx/dynlib.h"
|
#include "wx/dynlib.h"
|
||||||
|
#include "wx/dir.h"
|
||||||
|
|
||||||
#if defined(__WIN32__) && defined(__MINGW32__)
|
#if defined(__WIN32__) && defined(__MINGW32__)
|
||||||
#include "wx/msw/gccpriv.h"
|
#include "wx/msw/gccpriv.h"
|
||||||
@@ -1123,14 +1124,83 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags )
|
|||||||
return ::wxMkdir( dir, perm );
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user