X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/db759dde8747767a483f55941eb0b5d15527f06b..e0876d7381ada8459e18fc81a9e47c025778b8ec:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 12bc12daa7..b4ea82e56a 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -68,6 +68,9 @@ #endif #ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" // For GetShort/LongPathName + #endif #include "wx/dynarray.h" #include "wx/intl.h" #include "wx/log.h" @@ -81,12 +84,8 @@ #include "wx/file.h" #include "wx/dynlib.h" -// For GetShort/LongPathName -#ifdef __WIN32__ -#include "wx/msw/wrapwin.h" -#if defined(__MINGW32__) -#include "wx/msw/gccpriv.h" -#endif +#if defined(__WIN32__) && defined(__MINGW32__) + #include "wx/msw/gccpriv.h" #endif #ifdef __WXWINCE__ @@ -139,6 +138,10 @@ #define MAX_PATH _MAX_PATH #endif + +wxULongLong wxInvalidSize = (unsigned)-1; + + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -1043,7 +1046,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); @@ -1072,6 +1077,8 @@ bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targe MAX_PATH); hres = ppf->Load(wsz, 0); + ppf->Release(); + if (SUCCEEDED(hres)) { wxChar buf[2048]; @@ -1092,11 +1099,13 @@ bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targe } } } + + psl->Release(); } - psl->Release(); return success; } -#endif + +#endif // __WIN32__ && !__WXWINCE__ // ---------------------------------------------------------------------------- @@ -2019,6 +2028,87 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, #endif // wxUSE_DATETIME + +// ---------------------------------------------------------------------------- +// file size functions +// ---------------------------------------------------------------------------- + +/* static */ +wxULongLong wxFileName::GetSize(const wxString &filename) +{ + if (!wxFileExists(filename)) + return wxInvalidSize; + +#if defined(__WXPALMOS__) + // TODO + return wxInvalidSize; +#elif defined(__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 ;