ファイル名(C:\ folder \ foo.txt)があり、アンマネージC ++でフォルダー名(C:\ folder)を取得する必要があります。C#では、次のようにします。
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
アンマネージC ++でファイル名からパスを抽出するために使用できる関数はありますか?
ファイル名(C:\ folder \ foo.txt)があり、アンマネージC ++でフォルダー名(C:\ folder)を取得する必要があります。C#では、次のようにします。
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
アンマネージC ++でファイル名からパスを抽出するために使用できる関数はありますか?
回答:
これには、標準のWindows関数PathRemoveFileSpecがあります。Windows 8以降のみをサポートする場合は、代わりにPathCchRemoveFileSpecを使用することを強くお勧めします。他の改善の中でも、MAX_PATH
(260)文字に制限されなくなりました。
Boost.Filesystemの使用:
boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
parent_path()
from"C:\\folder"
が"C:"
。になるという事実に注意してください。
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;
}
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"
.remove_filename()
方法もあります。
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()
親フォルダの名前を取得する必要がある場合があります。
boost :: filesystemを使用します。とにかく次の規格に組み込まれるので、慣れてもいいでしょう。
_splitpathは優れたCRTソリューションです。
Posixの標準的な方法について誰も言及していないことにとても驚いています
basename / dirname
コンストラクトを使用してください。
manbasename
basname(char * path)
ないbasename(const char * path)
、と持っているように見えないん実装は、原理的には(それらはスレッドセーフでない可能静的なバッファを使用するために)あなた動的に割り当てられた結果を返すこともできますが、alloc
それはC ++では扱いにくいファミリ関数に依存することになります。
パス名はプラットフォーム固有であるため、標準のC ++はこの点であまり役に立ちません。文字列を手動で解析するか(glowcoderの回答のように)、オペレーティングシステム機能(http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspxなど)を使用するか、おそらく最善のアプローチは、boost :: filesystemのようなサードパーティのファイルシステムライブラリを使用できます。