如何在C ++ Builder中使用目录操作?

时间:2019-01-21 12:27:25

标签: directory c++builder c++builder-10.2-tokyo

我被困在用C ++ Builder创建目录中。如果您选中此herehere,则会发现适合我的情况的示例,但是当我尝试使用它们时,它们都不适合我!例如,以下代码用于创建目录,其中已经定义了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 :(得分:2)

您看到的是编译时错误,而不是运行时错误。编译器找不到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;
}