/** sys_read_dir : string -> string list <doc>Return the content of a directory</doc> **/ Array<String> _hx_std_sys_read_dir( String p ) { Array<String> result = Array_obj<String>::__new(); #if defined(NEKO_WINDOWS) const wchar_t *path = p.__WCStr(); size_t len = wcslen(path); if (len>MAX_PATH) return null(); WIN32_FIND_DATAW d; HANDLE handle; #if defined(HX_WINRT) && !defined(_XBOX_ONE) std::wstring tempWStr(path); std::string searchPath(tempWStr.begin(), tempWStr.end()); #else wchar_t searchPath[ MAX_PATH + 4 ]; memcpy(searchPath,path, len*sizeof(wchar_t)); #endif if( len && path[len-1] != '/' && path[len-1] != '\\' ) searchPath[len++] = '/'; searchPath[len++] = '*'; searchPath[len++] = '.'; searchPath[len++] = '*'; searchPath[len] = '\0'; hx::EnterGCFreeZone(); #if defined(HX_WINRT) && !defined(_XBOX_ONE) handle = FindFirstFileEx(searchPath.c_str(), FindExInfoStandard, &d, FindExSearchNameMatch, NULL, 0); #else handle = FindFirstFileW(searchPath,&d); #endif if( handle == INVALID_HANDLE_VALUE ) { hx::ExitGCFreeZone(); return null(); } while( true ) { // skip magic dirs if( d.cFileName[0] != '.' || (d.cFileName[1] != 0 && (d.cFileName[1] != '.' || d.cFileName[2] != 0)) ) { hx::ExitGCFreeZone(); result->push(String(d.cFileName)); hx::EnterGCFreeZone(); } if( !FindNextFileW(handle,&d) ) break; } FindClose(handle); #elif !defined(EPPC) const char *name = p.__s; hx::EnterGCFreeZone(); DIR *d = opendir(name); if( d == NULL ) { hx::ExitGCFreeZone(); hx::Throw(HX_CSTRING("Invalid directory")); } while( true ) { struct dirent *e = readdir(d); if( e == NULL ) break; // skip magic dirs if( e->d_name[0] == '.' && (e->d_name[1] == 0 || (e->d_name[1] == '.' && e->d_name[2] == 0)) ) continue; hx::ExitGCFreeZone(); result->push( String(e->d_name) ); hx::ExitGCFreeZone(); } closedir(d); #endif hx::ExitGCFreeZone(); return result; }
/** sys_read_dir : string -> string list <doc>Return the content of a directory</doc> **/ static value sys_read_dir( value p) { val_check(p,string); value result = alloc_array(0); #if defined(HX_WINRT) && defined(__cplusplus_winrt) auto folder = (Windows::Storage::StorageFolder::GetFolderFromPathAsync( ref new Platform::String(val_wstring(p)) ))->GetResults(); auto results = folder->GetFilesAsync(Windows::Storage::Search::CommonFileQuery::DefaultQuery)->GetResults(); for(int i=0;i<results->Size;i++) val_array_push(result,alloc_wstring(results->GetAt(i)->Path->Data())); #elif defined(NEKO_WINDOWS) && !defined(KORE_CONSOLE) const wchar_t *path = val_wstring(p); size_t len = wcslen(path); if (len>MAX_PATH) return alloc_null(); WIN32_FIND_DATAW d; HANDLE handle; #if defined(HX_WINRT) && !defined(_XBOX_ONE) std::wstring tempWStr(path); std::string searchPath(tempWStr.begin(), tempWStr.end()); #else wchar_t searchPath[ MAX_PATH + 4 ]; memcpy(searchPath,path, len*sizeof(wchar_t)); #endif if( len && path[len-1] != '/' && path[len-1] != '\\' ) searchPath[len++] = '/'; searchPath[len++] = '*'; searchPath[len++] = '.'; searchPath[len++] = '*'; searchPath[len] = '\0'; gc_enter_blocking(); #if defined(HX_WINRT) && !defined(_XBOX_ONE) handle = FindFirstFileEx(searchPath.c_str(), FindExInfoStandard, &d, FindExSearchNameMatch, NULL, 0); #else handle = FindFirstFileW(searchPath,&d); #endif if( handle == INVALID_HANDLE_VALUE ) { gc_exit_blocking(); return alloc_null(); } while( true ) { // skip magic dirs if( d.cFileName[0] != '.' || (d.cFileName[1] != 0 && (d.cFileName[1] != '.' || d.cFileName[2] != 0)) ) { gc_exit_blocking(); val_array_push(result,alloc_wstring(d.cFileName)); gc_enter_blocking(); } if( !FindNextFileW(handle,&d) ) break; } FindClose(handle); #elif !defined(EPPC) && !defined(KORE_CONSOLE) DIR *d; struct dirent *e; const char *name = val_string(p); gc_enter_blocking(); d = opendir(name); if( d == NULL ) { gc_exit_blocking(); val_throw(alloc_string("Invalid directory")); } while( true ) { e = readdir(d); if( e == NULL ) break; // skip magic dirs if( e->d_name[0] == '.' && (e->d_name[1] == 0 || (e->d_name[1] == '.' && e->d_name[2] == 0)) ) continue; gc_exit_blocking(); val_array_push(result, alloc_string(e->d_name) ); gc_enter_blocking(); } closedir(d); #endif gc_exit_blocking(); return result; }