ファイル名をドライブ名、ディレクトリ名、ファイル名、拡張子名に分割する

splitpath.png

まとめ

ファイル名分割 ファイル名取得 インクルード
C++ tr2::sys::path path("ファイルパス文字列"); tr2::sys::path.basename() #include <filesystem>
C splitpath() #include <windows.h>
python os.path.splitext() import os.path
C# System.IO.FileInfo() Path.GetFileNameWithoutExtension("name.ext"); using System.IO;

tr2::sys::path というのは、Visual Studio 2012にしてから出てきた(MSDNのbasic_pathクラスのページ)
元々はboostに入ってる機能、boost::filesystem::pathだったのが、デフォルトで使えるようになったようだ。

tr2::sys::path path("ファイルパス文字列");

と、tr2::sys::path クラスで初期化した時点で細かく分割してくれるようだ。
実験してみたところ、tr2::sys::pathには色々な関数があって、中には一見機能がかぶっているように見えるものもある。
ちょっと色々出力してみた。
その前にまとめると

  • ディレクトリの取得…parent_path() あるいは branch_path()
  • ファイル名の取得…basename()
  • 拡張子の取得…extenstion()
  • ドライブ名…root_path()…rootと名のついたものはドライブ名のようだ。
#include <iostream>
#include <filesystem>//tr2::sys::pathに必要
using namespace std;
int main(){
    string filename="F:/SecondYear/VCproject/cloud/raw-format/data/cloud-velocity.exe";
    tr2::sys::path path(filename);
    cout<<"ドライブ名(root_path):"<<path.root_path()<<endl;
    cout<<"ディレクトリ:"<<path.directory_string()<<endl;
    cout<<"ファイル名:"<<path.basename()<<endl;
    cout<<"filename"<<path.filename()<<endl;
    cout<<"file_string:"<<path.file_string()<<endl;
    cout<<"拡張子:"<<path.extension()<<endl;
    cout<<"root_name:"<<path.root_name()<<endl;
    cout<<"root_directory:"<<path.root_directory()<<endl;
    cout<<"フルパス:"<<path.string()<<endl;
 
    return 0;
}

出力結果
ドライブ名(root_path):F:/
ディレクトリ:F:\SecondYear\VCproject\cloud\raw-format\data\cloud-velocity.exe
ファイル名:cloud-velocity
filenamecloud-velocity.exe
file_string:F:\SecondYear\VCproject\cloud\raw-format\data\cloud-velocity.exe
拡張子:.exe
root_name:F:
root_directory:/
フルパス:F:/SecondYear/VCproject/cloud/raw-format/data/cloud-velocity.exe
parent_path:F:/SecondYear/VCproject/cloud/raw-format/data
leaf:cloud-velocity.exe
branch_path:F:/SecondYear/VCproject/cloud/raw-format/data

extension string

サポートサイト Wikidot.com extensionstring