web-dev-qa-db-ja.com

ファイル名からディレクトリ名を取得する

ファイル名(C:\ folder\foo.txt)があり、アンマネージC++でフォルダー名(C:\ folder)を取得する必要があります。 C#では、次のようにします。

string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;

ファイル名からパスを抽出するためにアンマネージC++で使用できる関数はありますか?

75
Jon Tackabury

これには標準のWindows関数 PathRemoveFileSpec があります。 Windows 8以降のみをサポートする場合は、代わりに PathCchRemoveFileSpec を使用することを強くお勧めします。その他の改善点の中で、MAX_PATH(260)文字に制限されなくなりました。

23

Boost.Filesystemの使用:

boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
143
AraK

http://www.cplusplus.com/reference/string/string/find_last_of/ の例

// string::find_last_of
#include <iostream>
#include <string>
using namespace std;

void SplitFilename (const string& str)
{
  size_t found;
  cout << "Splitting: " << str << endl;
  found=str.find_last_of("/\\");
  cout << " folder: " << str.substr(0,found) << endl;
  cout << " file: " << str.substr(found+1) << endl;
}

int main ()
{
  string str1 ("/usr/bin/man");
  string str2 ("c:\\windows\\winhelp.exe");

  SplitFilename (str1);
  SplitFilename (str2);

  return 0;
}
64
corsiKa

C++ 17には、クラスがあります std::filesystem::path メソッドの使用 parent_path

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."})
        std::cout << "The parent path of " << p
                  << " is " << p.parent_path() << '\n';
}

可能な出力:

The parent path of "/var/tmp/example.txt" is "/var/tmp"
The parent path of "/" is ""
The parent path of "/var/tmp/." is "/var/tmp"
22

なぜそんなに複雑なのですか?

#include <windows.h>

int main(int argc, char** argv)         // argv[0] = C:\dev\test.exe
{
    char *p = strrchr(argv[0], '\\');
    if(p) p[0] = 0;

    printf(argv[0]);                    // argv[0] = C:\dev
}
11
toster-cx

Boost :: filesystemを使用します。とにかく次の標準に組み込まれるので、慣れることもできます。

5
Edward Strange
_ auto p = boost::filesystem::path("test/folder/file.txt");
 std::cout << p.parent_path() << '\n';             // test/folder
 std::cout << p.parent_path().filename() << '\n';  // folder
 std::cout << p.filename() << '\n';                // file.txt
_

親フォルダの名前を取得するには、p.parent_path().filename()が必要になる場合があります。

4
srbcheema1

_ splitpath はニースCRTソリューションです。

2
Ofek Shilon

誰もPosixの標準的な方法に言及していないことにとても驚きました

使ってください basename / dirnameコンストラクト。

男のベースネーム

1
Utkarsh Kumar