Справочник рекурса в белке

Можно ли проверить содержимое каталога на белка? Мне нужен список имен файлов, включая их пути, в данном каталоге и его подкаталогах.

Я пишу сценарий для использования в Code::Blocks, который использует белку в качестве языка сценариев. Я взглянул на стандартную библиотеку белка, но не смог найти никаких операций, связанных с файлами. Также возможно передать эту задачу внешнему скрипту (bash или какому-либо другому), но я бы предпочел этого не делать.

2 ответа

  1. Загрузите форму tinydir: https://github.com/cxong/tinydir

  2. Добавьте системный API для squrriel:

static SQInteger _system_getfiles(HSQUIRRELVM v)
{
    const SQChar *dirPath;
    sq_getstring(v, 2, &dirPath);
    sq_newarray(v,0);

    printf("Get dir %s;\r\n", dirPath);
    tinydir_dir dir;
    tinydir_open(&dir, dirPath);

    while (dir.has_next)
    {
        tinydir_file file;
        tinydir_readfile(&dir, &file);

//        printf("%s\r\n", file.name);
//        if (file.is_dir)
//        {
//            printf("/");
//        }
//        printf("\n");

        if (!file.is_dir)
        {
            sq_pushstring(v, file.name, -1);
            sq_arrayappend(v, -2);
        }

        tinydir_next(&dir);
    }

    tinydir_close(&dir);

//    sq_newarray(v,0);
//    sq_pushstring(v, "test_001.c", -1);
//    sq_arrayappend(v, -2);
//    sq_pushstring(v, "test_002.c", -1);
//    sq_arrayappend(v, -2);
//    sq_pushstring(v, "test_003.c", -1);
//    sq_arrayappend(v, -2);

    return 1;
}
#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}
static const SQRegFunction systemlib_funcs[]={
    _DECL_FUNC(getenv,2,_SC(".s")),
    _DECL_FUNC(system,2,_SC(".s")),
    _DECL_FUNC(clock,0,NULL),
    _DECL_FUNC(time,1,NULL),
    _DECL_FUNC(date,-1,_SC(".nn")),
    _DECL_FUNC(remove,2,_SC(".s")),
    _DECL_FUNC(rename,3,_SC(".ss")),
    _DECL_FUNC(getfiles,2,_SC(".s")),
    {NULL,(SQFUNCTION)0,0,NULL}
};
#undef _DECL_FUNC

  1. Результат теста:

sq>local files=getfiles("c:");foreach(file in files){print(file + "\r\n");}
Get dir c:;
devcon64.exe
espacePlugin.log
java14224.reg
MyProject.smp
ns_fp.ocx
pagefile.sys
ScanResult.log
test.log
test1.log
UpdateDocPermission.log
UpdateVMLog.txt
UserAgentData.log
UserData.log

sq>

Белка не имеет встроенных функций ввода / вывода. Вам придется написать один на стороне C++ и представить эту функцию Squirrel.

Другие вопросы по тегам