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関数