WIn32API 便利なシェルAPI
StrFormatByteSize64
この関数は、整数を書式化する際に、KB, MB, GBなどの単位を自動的につけてくれます。#include <windows.h> #include <stdio.h> #include <locale.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { LONGLONG qdwNumber; TCHAR szBuf[32]; UINT uiSize = sizeof(szBuf)/sizeof(szBuf[0]); //Unicode文字列をコンソールに表示させるため setlocale(LC_ALL, setlocale(LC_CTYPE, "")); //2Byte qdwNumber = 2; StrFormatByteSize64(qdwNumber, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //2KB qdwNumber = 2*1024; StrFormatByteSize64(qdwNumber, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //2MB qdwNumber = 2*1024*1024; StrFormatByteSize64(qdwNumber, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //1GB qdwNumber = 1024*1024*1024; StrFormatByteSize64(qdwNumber, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //2GB qdwNumber = (LONGLONG)2*(LONGLONG)(1024*1024*1024); StrFormatByteSize64(qdwNumber, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); return 0; }
2 バイト 2.00 KB 2.00 MB 1.00 GB 2.00 GB
StrFormatByteSizeW
この関数はStrFormatByteSize64と同様に数値をKB, MB, GBなどの単位をつけて書式化します。#include <windows.h> #include <stdio.h> #include <locale.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { LONGLONG qdwNumber; WCHAR szBuf[32]; UINT uiSize = sizeof(szBuf)/sizeof(szBuf[0]);; //Unicode文字列をコンソールに表示させるため setlocale(LC_ALL, setlocale(LC_CTYPE, "")); //2Byte qdwNumber = 2; StrFormatByteSizeW(qdwNumber, szBuf, uiSize); wprintf(L"%s\n", szBuf); //2KB qdwNumber = 2*1024; StrFormatByteSizeW(qdwNumber, szBuf, uiSize); wprintf(L"%s\n", szBuf); //2MB qdwNumber = 2*1024*1024; StrFormatByteSizeW(qdwNumber, szBuf, uiSize); wprintf(L"%s\n", szBuf); //1GB qdwNumber = 1024*1024*1024; StrFormatByteSizeW(qdwNumber, szBuf, uiSize); wprintf(L"%s\n", szBuf); //2GB qdwNumber = (LONGLONG)2*(LONGLONG)(1024*1024*1024); StrFormatByteSizeW(qdwNumber, szBuf, uiSize); wprintf(L"%s\n", szBuf); return 0; }
2 バイト 2.00 KB 2.00 MB 1.00 GB 2.00 GB
結果は、StrFormatByteSize64と同じでした。
StrFormatByteSizeEx
StrFormatByteSizeEx関数も上述の関数と同じ機能になります。ただし、整数の型がULONGLONG型になっているところが異なります。#include <windows.h> #include <stdio.h> #include <locale.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { ULONGLONG ull; WCHAR szBuf[32]; UINT uiSize = sizeof(szBuf)/sizeof(szBuf[0]); //Unicode文字列をコンソールに表示させるため setlocale(LC_ALL, setlocale(LC_CTYPE, "")); //2Byte ull = 2; StrFormatByteSizeEx(ull, SFBS_FLAGS_TRUNCATE_UNDISPLAYED_DECIMAL_DIGITS, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //2KB ull = 2*1024; StrFormatByteSizeEx(ull, SFBS_FLAGS_TRUNCATE_UNDISPLAYED_DECIMAL_DIGITS, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //2MB ull = 2*1024*1024; StrFormatByteSizeEx(ull, SFBS_FLAGS_TRUNCATE_UNDISPLAYED_DECIMAL_DIGITS, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); //100GB ull= (ULONGLONG)100 * (ULONGLONG)(1024*1024*1024); StrFormatByteSizeEx(ull, SFBS_FLAGS_TRUNCATE_UNDISPLAYED_DECIMAL_DIGITS, szBuf, uiSize); _tprintf(TEXT("%s\n"), szBuf); return 0; }
2 バイト 2.00 KB 2.00 MB 100 GB
StrFormatKBSize
この関数は、上述の関数と同様に整数を書式化しますが、KB単位で書式化します。#include <windows.h> #include <stdio.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { LONGLONG qdwNumber; WCHAR szBuf[32]; UINT uiSize = sizeof(szBuf)/sizeof(szBuf[0]); //2Byte qdwNumber = 2; StrFormatKBSize(qdwNumber, szBuf, uiSize); _tprintf(L"%s\n", szBuf); //2KB qdwNumber = 2*1024; StrFormatKBSize(qdwNumber, szBuf, uiSize); _tprintf(L"%s\n", szBuf); //2MB qdwNumber = 2*1024*1024; StrFormatKBSize(qdwNumber, szBuf, uiSize); _tprintf(L"%s\n", szBuf); //1GB qdwNumber = 1024*1024*1024; StrFormatKBSize(qdwNumber, szBuf, uiSize); _tprintf(L"%s\n", szBuf); //2GB qdwNumber = 2*1024*1024*1024; StrFormatKBSize(qdwNumber, szBuf, uiSize); _tprintf(L"%s\n", szBuf); return 0; }
1 KB 2 KB 2,048 KB 1,048,576 KB (2,097,151) KB
StrFromTimeInterval
StrFromTimeInterval関数は、整数を秒、分、時などの単位に換算してくれるAPIです。#include <windows.h> #include <stdio.h> #include <locale.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { WCHAR szBuf[32]; DWORD dwTimeMS; UINT uiSize = sizeof(szBuf)/sizeof(szBuf[0]); //Unicode文字列をコンソールに表示させるため setlocale(LC_ALL, ::setlocale(LC_CTYPE, "")); //100ミリ秒 dwTimeMS = 100; StrFromTimeInterval(szBuf, uiSize, dwTimeMS, 10); wprintf(L"%s\n", szBuf); //1秒 dwTimeMS = 1000; StrFromTimeInterval(szBuf, uiSize, dwTimeMS, 10); wprintf(L"%s\n", szBuf); //100秒 dwTimeMS = 100*1000; StrFromTimeInterval(szBuf, uiSize, dwTimeMS, 10); wprintf(L"%s\n", szBuf); //1万秒 dwTimeMS = 10000*1000; StrFromTimeInterval(szBuf, uiSize, dwTimeMS, 10); wprintf(L"%s\n", szBuf); //10万秒 dwTimeMS = 100000*1000; StrFromTimeInterval(szBuf, uiSize, dwTimeMS, 10); wprintf(L"%s\n", szBuf); return 0; }
0 秒 1 秒 1 分 40 秒 2 時間 46 分 40 秒 27 時間 46 分 40 秒
参考
http://www.netagent-blog.jp/archives/51774253.html 第1回 Win32 API 探検隊
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759971(v=vs.85).aspx StrFormatByteSize64関数
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759975(v=vs.85).aspx StrFormatByteSizeW関数
http://msdn.microsoft.com/en-us/library/windows/desktop/bb892884(v=vs.85).aspx StrFormatByteSizeEx関数
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759979(v=vs.85).aspx StrFormatKBSize関数
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759980(v=vs.85).aspx StrFromTimeInterval関数