X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6091caf0882b123cfc6698fb1f35a9e8d7ce5f59..0d91b2342a1f83b3b9db145c7210efd5d9547cc8:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 2e4c842d66..f55a693ae8 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -68,15 +68,16 @@ #endif #ifndef WX_PRECOMP -#include "wx/intl.h" -#include "wx/log.h" -#include "wx/file.h" + #include "wx/dynarray.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/file.h" + #include "wx/utils.h" #endif #include "wx/filename.h" #include "wx/tokenzr.h" #include "wx/config.h" // for wxExpandEnvVars -#include "wx/utils.h" #include "wx/file.h" #include "wx/dynlib.h" @@ -138,6 +139,10 @@ #define MAX_PATH _MAX_PATH #endif + +wxULongLong wxInvalidSize = (unsigned)-1; + + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -518,7 +523,7 @@ bool wxFileName::FileExists( const wxString &file ) bool wxFileName::DirExists() const { - return wxFileName::DirExists( GetFullPath() ); + return wxFileName::DirExists( GetPath() ); } bool wxFileName::DirExists( const wxString &dir ) @@ -561,7 +566,7 @@ wxString wxFileName::GetCwd(const wxString& volume) bool wxFileName::SetCwd() { - return wxFileName::SetCwd( GetFullPath() ); + return wxFileName::SetCwd( GetPath() ); } bool wxFileName::SetCwd( const wxString &cwd ) @@ -621,7 +626,8 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) if (dir.empty()) { // FIXME. Create \temp dir? - dir = wxT("\\"); + if (DirExists(wxT("\\temp"))) + dir = wxT("\\temp"); } path = dir + wxT("\\") + name; int i = 1; @@ -797,7 +803,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) bool wxFileName::Mkdir( int perm, int flags ) { - return wxFileName::Mkdir( GetFullPath(), perm, flags ); + return wxFileName::Mkdir(GetPath(), perm, flags); } bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) @@ -848,7 +854,7 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) bool wxFileName::Rmdir() { - return wxFileName::Rmdir( GetFullPath() ); + return wxFileName::Rmdir( GetPath() ); } bool wxFileName::Rmdir( const wxString &dir ) @@ -1041,7 +1047,9 @@ bool wxFileName::Normalize(int flags, #include #endif -bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targetFilename, wxString* arguments) +bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, + wxString& targetFilename, + wxString* arguments) { wxString path, file, ext; wxSplitPath(shortcutPath, & path, & file, & ext); @@ -1070,6 +1078,8 @@ bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targe MAX_PATH); hres = ppf->Load(wsz, 0); + ppf->Release(); + if (SUCCEEDED(hres)) { wxChar buf[2048]; @@ -1090,11 +1100,13 @@ bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targe } } } + + psl->Release(); } - psl->Release(); return success; } -#endif + +#endif // __WIN32__ && !__WXWINCE__ // ---------------------------------------------------------------------------- @@ -2017,6 +2029,84 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, #endif // wxUSE_DATETIME + +// ---------------------------------------------------------------------------- +// file size functions +// ---------------------------------------------------------------------------- + +/* static */ +wxULongLong wxFileName::GetSize(const wxString &filename) +{ + if (!wxFileExists(filename)) + return wxInvalidSize; + +#ifdef __WIN32__ + wxFileHandle f(filename, wxFileHandle::Read); + if (!f.IsOk()) + return wxInvalidSize; + + DWORD lpFileSizeHigh; + DWORD ret = GetFileSize(f, &lpFileSizeHigh); + if (ret == INVALID_FILE_SIZE) + return wxInvalidSize; + + // compose the low-order and high-order byte sizes + return wxULongLong(ret | (lpFileSizeHigh << sizeof(WORD)*2)); + +#else // ! __WIN32__ + + wxStructStat st; +#ifndef wxNEED_WX_UNISTD_H + if (wxStat( filename.fn_str() , &st) != 0) +#else + if (wxStat( filename, &st) != 0) +#endif + return wxInvalidSize; + return wxULongLong(st.st_size); +#endif +} + +/* static */ +wxString wxFileName::GetHumanReadableSize(const wxULongLong &bs, + const wxString &nullsize, + int precision) +{ + static const double KILOBYTESIZE = 1024.0; + static const double MEGABYTESIZE = 1024.0*KILOBYTESIZE; + static const double GIGABYTESIZE = 1024.0*MEGABYTESIZE; + static const double TERABYTESIZE = 1024.0*GIGABYTESIZE; + + if (bs == 0 || bs == wxInvalidSize) + return nullsize; + + double bytesize = bs.ToDouble(); + if (bytesize < KILOBYTESIZE) + return wxString::Format(_("%s B"), bs.ToString().c_str()); + if (bytesize < MEGABYTESIZE) + return wxString::Format(_("%.*f kB"), precision, bytesize/KILOBYTESIZE); + if (bytesize < GIGABYTESIZE) + return wxString::Format(_("%.*f MB"), precision, bytesize/MEGABYTESIZE); + if (bytesize < TERABYTESIZE) + return wxString::Format(_("%.*f GB"), precision, bytesize/GIGABYTESIZE); + + return wxString::Format(_("%.*f TB"), precision, bytesize/TERABYTESIZE); +} + +wxULongLong wxFileName::GetSize() const +{ + return GetSize(GetFullPath()); +} + +wxString wxFileName::GetHumanReadableSize(const wxString &failmsg, int precision) const +{ + return GetHumanReadableSize(GetSize(), failmsg, precision); +} + + +// ---------------------------------------------------------------------------- +// Mac-specific functions +// ---------------------------------------------------------------------------- + #ifdef __WXMAC__ const short kMacExtensionMaxLength = 16 ; @@ -2046,7 +2136,6 @@ public : OSType m_creator ; } ; -#include "wx/dynarray.h" WX_DECLARE_OBJARRAY(MacDefaultExtensionRecord, MacDefaultExtensionArray) ; bool gMacDefaultExtensionsInited = false ;