在squirrel中递归目录

时间:2014-11-26 19:16:24

标签: file directory squirrel

是否可以检查squirrel中目录的内容?我需要一个文件名列表,包括它们在给定目录及其子目录中的路径。

我正在编写一个用于Code :: Blocks的脚本,它使用squirrel作为脚本语言。我看过松鼠标准库,但无法找到任何与文件相关的操作。也可以将此任务外包给外部脚本(bash或其他),但我不想这样做。

2 个答案:

答案 0 :(得分:1)

Squirrel没有任何内置的I / O功能。您必须在C ++端编写一个并将该函数公开给Squirrel。

答案 1 :(得分:1)

  1. 下载tinydir表格:https://github.com/cxong/tinydir

  2. 为squrriel添加系统API:

  3. 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
    

    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. 测试结果:
    2. 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>