Показать сообщение отдельно
Старый 01.02.2016, 15:48   #7  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
Большое спасибо AndyD.
Мне надо было получать все файлы из папки и подпапок по маске. переделал:
X++:
static container FindFiles(str Path,str Mask)
{
    DLL         _winApiDLL      = new DLL('KERNEL32');
    DLLFunction _findNextFile  = new DLLFunction(_winApiDLL, 'FindNextFileA');
    container res;

    #define.FILE_ATTRIBUTE_DIRECTORY(0x00000010)
    container findNextFileLoc(int handle)
    {
        Binary      data            = new Binary(0x200);
        ;
        if (_findNextFile.call(handle, data))
            return [data.DWord(0), data.string(44)];
        return connull();
    }

    void findFilesOnDisk(str _path)
    {
        container           files;
        container           c;
        FileName            fileName;
        boolean             directory;
        ;
        if (substr(_path, strlen(_path), 1) != "\\") _path += "\\";
        files = WinApi::findFirstFile(_path + "*.*");
        if (files != connull() && conpeek(files, 1) != -1)
        {
            fileName = conpeek(files, 2);
            directory = conpeek(files, 3);
            while (fileName)
            {
                if (directory && fileName != "." && fileName != "..")
                    findFilesOnDisk(_path + fileName + "\\");
                else if(subStr(fileName,strLen(fileName)-2,strLen(fileName))==Mask)res+=(_path + fileName);

                c = findNextFileLoc(conpeek(files, 1));
                if (c == connull())
                    break;
                fileName = conpeek(c, 2);
                directory = conpeek(c, 1) & #FILE_ATTRIBUTE_DIRECTORY != 0;
            }
            WinApi::findClose(conpeek(files, 1));
        }
    }
    ;
    _findNextFile.returns(ExtTypes::DWord);

    _findNextFile.arg(ExtTypes::DWord,
                       ExtTypes::Pointer);
    res=conNull();
    findFilesOnDisk(Path);
    return res;
}