获取文件所在目录的最简单方法是什么?我正在使用它来查找工作目录。
string filename = "C:\MyDirectory\MyFile.bat"
在这个例子中,我应该得到“C:\ MyDirectory”。
答案 0 :(得分:17)
使用Boost.filesystem parent_path()函数。
实施例。参数 c:/ foo / bar => C:/富
此处有更多示例:path decomposition table和教程here。
答案 1 :(得分:16)
快速而肮脏:
请注意,必须也会查找/
,因为Windows上允许使用替代路径分隔符
#include <string>
#include <iostream>
std::string dirnameOf(const std::string& fname)
{
size_t pos = fname.find_last_of("\\/");
return (std::string::npos == pos)
? ""
: fname.substr(0, pos);
}
int main(int argc, const char *argv[])
{
const std::string fname = "C:\\MyDirectory\\MyFile.bat";
std::cout << dirnameOf(fname) << std::endl;
}
答案 2 :(得分:15)
初始化不正确,因为您需要转义反斜杠:
string filename = "C:\\MyDirectory\\MyFile.bat";
提取目录(如果存在):
string directory;
const size_t last_slash_idx = filename.rfind('\\');
if (std::string::npos != last_slash_idx)
{
directory = filename.substr(0, last_slash_idx);
}
答案 3 :(得分:12)
MFC方式;
#include <afx.h>
CString GetContainingFolder(CString &file)
{
CFileFind fileFind;
fileFind.FindFile(file);
fileFind.FindNextFile();
return fileFind.GetRoot();
}
或者,甚至更简单
CString path(L"C:\\my\\path\\document.txt");
path.Truncate(path.ReverseFind('\\'));
答案 4 :(得分:5)
您可以使用stdlib.h头文件中提供的_spliltpath函数。请参阅此链接。
http://msdn.microsoft.com/en-us/library/aa273364%28v=VS.60%29.aspx
答案 5 :(得分:4)
由于问题已经过时,但我想添加一个答案,以便对其他人有所帮助 在Visual c + +中,您也可以使用CString或char数组
CString filename = _T("C:\\MyDirectory\\MyFile.bat");
PathRemoveFileSpec(filename);
<强>输出:强>
C:\ mydirectory中
在您的标头文件中包含Shlwapi.h
。
MSDN LINK,您可以查看示例。
答案 6 :(得分:3)
一个非常简单的跨平台解决方案(改编自string::find_last_of
的{{3}}):
std::string GetDirectory (const std::string& path)
{
size_t found = path.find_last_of("/\\");
return(path.substr(0, found));
}
这适用于斜杠可以向后或向前指向(或混合)的两种情况,因为它只是查找字符串path
中最后一次出现的斜杠。
但是,我的个人偏好是使用Boost :: Filesystem库来处理这样的操作。一个例子:
std::string GetDirectory (const std::string& path)
{
boost::filesystem::path p(path);
return(p.parent_path().string());
}
虽然,如果从字符串获取目录路径是你需要的唯一功能,那么Boost可能有点过分(特别是因为Boost :: Filesystem是少数几个不仅仅是头文件的Boost库之一)。但是,AFIK,Boost :: Filesystem已被批准包含在TR2标准中,但在C ++ 14或C ++ 17标准之前可能无法完全可用(可能是后者,基于this example) ,因此,根据您的编译器(以及您何时阅读本文),您可能甚至不需要再单独编译它们,因为它们可能已经包含在您的系统中。例如,Visual Studio 2012已经可以使用一些TR2文件系统组件(根据this answer),虽然我还没有尝试过,因为我还在使用Visual Studio 2010 ...
答案 7 :(得分:2)
这是正确的winapi解决方案:
CString csFolder = _T("c:\temp\file.ext");
PathRemoveFileSpec(csFolder.GetBuffer(0));
csFolder.ReleaseBuffer(-1);
答案 8 :(得分:1)
C ++ 17提供了std::filesystem::path。它可能在C ++ 11中可用;与-lstdc ++ fs链接。注意,该函数不会验证路径是否存在;使用std :: filesystem :: status确定文件类型(可能是filetype :: notfound)
答案 9 :(得分:1)
从 C++17 开始,您可以使用 std::filesystem::parent_path:
#include <filesystem>
#include <iostream>
int main() {
std::string filename = "C:\\MyDirectory\\MyFile.bat";
std::string directory = std::filesystem::path(filename).parent_path().u8string();
std::cout << directory << std::endl;
}
答案 10 :(得分:0)
甲壳虫的方式)
#include<tchar.h>
int GetDir(TCHAR *fullPath, TCHAR *dir) {
const int buffSize = 1024;
TCHAR buff[buffSize] = {0};
int buffCounter = 0;
int dirSymbolCounter = 0;
for (int i = 0; i < _tcslen(fullPath); i++) {
if (fullPath[i] != L'\\') {
if (buffCounter < buffSize) buff[buffCounter++] = fullPath[i];
else return -1;
} else {
for (int i2 = 0; i2 < buffCounter; i2++) {
dir[dirSymbolCounter++] = buff[i2];
buff[i2] = 0;
}
dir[dirSymbolCounter++] = fullPath[i];
buffCounter = 0;
}
}
return dirSymbolCounter;
}
使用:
TCHAR *path = L"C:\\Windows\\System32\\cmd.exe";
TCHAR dir[1024] = {0};
GetDir(path, dir);
wprintf(L"%s\n%s\n", path, dir);
答案 11 :(得分:0)
您只需搜索最后一个“\”,然后剪切字符串:
string filePath = "C:\MyDirectory\MyFile.bat"
size_t slash = filePath.find_last_of("\");
string dirPath = (slash != std::string::npos) ? filePath.substr(0, slash) : filePath;
确保在Linux中搜索“/”而不是“\”:
size_t slash = filePath.find_last_of("/");