Entry

プログラミングメモ - 意外と知られていない GetCurrentDirectory() の使い方

2009年02月07日

Win API の GetCurrentDirectory() 関数なんですけど,ネットのサンプルを見ていると MAX_PATH 分の長さを指定して取得していることが多いみたい。ただ,この MAX_PATH なんですけど,260固定で本当に API 全体に共通する最大値を表しているとは限りません。バッファの長さに変な値を指定すると,途切れた文字列が入ってくることもあります。

ここら辺,正確に文字列の長さを取る方法がないのかというと,そんなはずはありません。GetCurrentDirectory の場合,引数に NULL を指定すれば,返値となる文字列の長さが返ります(_MBCS はバイト数,_UNICODE は文字数)。つまり,こんな感じにすれば,あてずっぽうな長さでバッファを取らなくてもいいわけです。

#include <iostream>
#include <string>
#include <windows.h>

std::string
getCurrentDirectory() {
    std::string dir;
    unsigned long len = GetCurrentDirectory(0, 0);  // GETTING PATH LENGTH
    if (len > 0) {
        try {
            LPTSTR buf = new TCHAR[len];
            GetCurrentDirectory(len, buf);
            dir = buf;
            delete[] buf;
        } catch (std::bad_alloc) {
            throw std::domain_error("getting current directory failed.");
        }
    }
    return dir;
}

int
main(int argc, char* argv[]) {
    try {
        std::cout << getCurrentDirectory() << std::endl;
    } catch (std::domain_error& e) {
        std::cout << e.what() << std::endl;
    }
    return 0;
}

これは,GetCurrentDirectory() だけでなく,GetWindowsDirectory() のような似たような API でも,同じような使い方ができます。ま,MSDN の説明 では MAX_PATH を指定しろと書いてあるんですけど。

ちょこっと使うのにきっちりとした長さで文字列を取るのは仰々しいかもしれないけれど,ま,そゆ取り方もあるってこと。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN