Как использовать операции с каталогами в C ++ Builder? - PullRequest
0 голосов
/ 21 января 2019

Я застрял в создании каталога с помощью 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 Ответ

0 голосов
/ 21 января 2019

То, что вы видите, это ошибка компиляции , а не ошибка времени выполнения. Компилятор не может найти определение класса 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;
}
...