ショートファイル名からロングファイル名を取得する

ショートファイル名からロングファイル名に変換するには
GetLongPathName()と言うAPIで実現できますが
Windows95では対応していない為、いまいち使えません。

他の方法としてFindFirstFile()CFileFindクラスを使用して
短いファイル名を検索すると長いファイル名が取得できます。
これならWindows95にも対応できますが、いちいちコードを書くのは
ちょっと面倒臭いので関数を作成してしまいましょう。

普通はFindFirstFile()を使用しますがここはMFCプログラミングのコーナーなので
CFileFindクラスを使用します。
一つ注意としてFindFile()でショートファイル名を検索しGetFilePath()
ロングファイル名を取得することが出来ますが
ディレクトリ名はロングファイル名に変換されません。
そのためディレクトリ名も1つずつ検索してロングファイル名に変えていきます。


/*-------------------------------------------------------------------------------/

  関数名:CString GetLongFileName(LPCTSTR lpShortPath)
  引 数:lpShortPath ショートファイル名が入った文字列へのポインタを指定。
  戻り値:ショートファイル名に対応したロングファイル名。(フルパス)
      ショートファイル名のファイルが見つからないときは空の文字列を返します。
  解 説:ショートファイル名からロングファイル名を取得。

/-------------------------------------------------------------------------------*/
CString GetLongFileName(LPCTSTR lpShortPath)
{
    CFileFind fnd;
    int nStart = 2;
    CString strLongPath;
    if(fnd.FindFile(lpShortPath, 0))
    {
        // ショートファイルネームのフルパスを取得
        fnd.FindNextFile();
        CString strShortPath = fnd.GetFilePath();
        fnd.Close();

        strLongPath = strShortPath.Left(2);

        // ディレクトリ名もロングファイル名変換する。
        while(nStart != -1)
        {
            strLongPath += _T("\\");

            // ディレクトリを1つずつ取り出す
            nStart = strShortPath.Find('\\', nStart + 1);

            // ディレクトリのロングファイル名を取得
            if(nStart != -1)
                fnd.FindFile(strShortPath.Left(nStart), 0);

            // 最後のファイル名のロングファイル名を取得
            else
                fnd.FindFile(strShortPath, 0);

            // ロングファイル名に変換したものを記憶していく
            fnd.FindNextFile();
            strLongPath += fnd.GetFileName();
            fnd.Close();
        }
    }
    return strLongPath;
}

以下に使用例を示します。


// 実行ファイルにドラッグされたファイルのアドレスはWindows95/98では
// ショートファイル名になる為ロングファイル名に変換する。
AfxMessageBox(__argv[1]);
CString strLongFileName = GetLongFileName(__argv[1]);
AfxMessageBox(strLongFileName);

< 戻る << HOME ©1999-2001 by Akky, All right reserved.