Как использовать операции с каталогами в C++Builder?

Я застрял в создании каталога с помощью C++Builder. Если вы проверите это здесь и здесь, я найду примеры для своего случая, но когда я пытаюсь их использовать, ни один из них не работает для меня! Например, следующий код для создания каталога, где edSourcePath->Text значение было определено.

К сожалению, документация не полная.

try
{
    /* Create directory to specified path */
    TDirectory::CreateDirectory(edSourcePath->Text);
}
catch (...)
{
    /* Catch the possible exceptions */
    MessageDlg("Incorrect path", mtError, TMsgDlgButtons() << mbOK, NULL);
    return;
}

Сообщение об ошибке говорит TDirectory это не класс или пространство имен.

Другой вопрос, как я могу передать исходный путь и имя каталога CreateDirectory(edSourcePath->Text)?

1 ответ

Решение

То, что вы видите, это ошибка времени компиляции, а не ошибка времени выполнения. Компилятор не может найти определение TDirectory учебный класс. Вам нужно #include заголовочный файл, который TDirectory определяется, например:

#include <System.IOUtils.hpp> // <-- add this!

try
{
    /* Create directory to specified path */
    TDirectory::CreateDirectory(edSourcePath->Text);

    // or, if either DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE or
    // NO_USING_NAMESPACE_SYSTEM_IOUTILS is defined, you need
    // to use the fully qualified name instead:
    //
    // System::Ioutils::TDirectory::CreateDirectory(edSourcePath->Text);
}
catch (const Exception &e)
{
    /* Catch the possible exceptions */
    MessageDlg("Incorrect path.\n" + e.Message, mtError, TMsgDlgButtons() << mbOK, NULL);
    return;
}

Обратите внимание, однако, что TDirectory::CreateDirectory() выдает исключение ТОЛЬКО если вход String не является допустимым отформатированным путем. Это НЕ выдает исключение, если фактическое создание каталога не удается. На самом деле, нет способа обнаружить это состояние с TDirectory::CreateDirectory() сам, вам придется проверить с TDirectory::Exists() впоследствии:

#include <System.IOUtils.hpp>

try
{
    /* Create directory to specified path */
    String path = edSourcePath->Text;
    TDirectory::CreateDirectory(path);
    if (!TDirectory::Exists(path))
        throw Exception("Error creating directory");
}
catch (const Exception &e)
{
    /* Catch the possible exceptions */
    MessageDlg(e.Message, mtError, TMsgDlgButtons() << mbOK, NULL);
    return;
}

Иначе, TDirectory::CreateDirectory() это просто валидатор для System::Sysutils::ForceDirectories(), который имеет bool возвращаемое значение Таким образом, вы можете просто вызвать эту функцию напрямую:

#include <System.SysUtils.hpp>

/* Create directory to specified path */
if (!ForceDirectories(edSourcePath->Text)) // or: System::Sysutils::ForceDirectories(...), if needed
{
    MessageDlg("Error creating directory", mtError, TMsgDlgButtons() << mbOK, NULL);
    return;
}
Другие вопросы по тегам