Получение имени каталога от имени файла

У меня есть имя файла (C:\folder\foo.txt), и я должен получить имя папки (C:\folder) в неуправляемом C++. В C# я сделал бы что-то вроде этого:

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

Существует ли функция, которая может использоваться в неуправляемом C++ для извлечения пути из имени файла?

76
задан Jon Tackabury 18 June 2010 в 17:02
поделиться

6 ответов

Для этого есть стандартная функция Windows, PathRemoveFileSpec . Если вы поддерживаете только Windows 8 и новее, настоятельно рекомендуется использовать вместо него PathCchRemoveFileSpec . Среди других улучшений, он больше не ограничен MAX_PATH (260) символами.

23
ответ дан 24 November 2019 в 11:04
поделиться

Использовать boost :: filesystem. В любом случае он будет включен в следующий стандарт, так что вы можете к нему привыкнуть.

5
ответ дан 24 November 2019 в 11:04
поделиться

Использование Boost.Filesystem:

boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
146
ответ дан 24 November 2019 в 11:04
поделиться

_splitpath - хорошее решение для CRT.

2
ответ дан 24 November 2019 в 11:04
поделиться

Пример из 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;
}
67
ответ дан 24 November 2019 в 11:04
поделиться

Стандартный C ++ мало что вам даст в этом отношении, поскольку имена путей зависят от платформы. Вы можете вручную проанализировать строку (как в ответе светового кодера), используя средства операционной системы (например, http://msdn.microsoft.com/en-us/library/aa364232 (v = VS.85) .aspx ]), или, вероятно, лучший подход, вы можете использовать стороннюю библиотеку файловой системы, например boost :: filesystem.

-1
ответ дан 24 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: