bool FileSys::OpenDIR() { DIR * dir; struct dirent * entry; string currentDIR = GetDIR(); dir = opendir( currentDIR.c_str() ); if ( !dir ) { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Запрещенно", GetDIR().c_str(), NULL ); Upward(); return false; } EmptyFoldersAndFiles(); while ( ( entry = readdir(dir) ) != NULL ) { if( entry->d_name[0] != '.' ) { if( entry->d_type == DT_DIR ) foldersInDIR.push_back( entry->d_name ); if( entry->d_type == DT_REG ) filesInDIR.push_back( entry->d_name ); } }; allFilesInDIR = filesInDIR.size(); allFoldersInDIR = foldersInDIR.size(); closedir(dir); return true; }
/* * call-seq: * dir.close => nil * * Closes the directory stream. Any further attempts to access * <em>dir</em> will raise an <code>IOError</code>. * * d = Dir.new("testdir") * d.close #=> nil */ static VALUE dir_close(VALUE dir) { struct dir_data *dirp; GetDIR(dir, dirp); closedir(dirp->dir); dirp->dir = NULL; return Qnil; }
/* * call-seq: * dir.rewind => dir * * Repositions <em>dir</em> to the first entry. * * d = Dir.new("testdir") * d.read #=> "." * d.rewind #=> #<Dir:0x401b3fb0> * d.read #=> "." */ static VALUE dir_rewind(VALUE dir) { struct dir_data *dirp; if (rb_safe_level() >= 4 && !OBJ_TAINTED(dir)) { rb_raise(rb_eSecurityError, "Insecure: can't close"); } GetDIR(dir, dirp); rewinddir(dirp->dir); return dir; }
/* * call-seq: * dir.seek( integer ) => dir * * Seeks to a particular location in <em>dir</em>. <i>integer</i> * must be a value returned by <code>Dir#tell</code>. * * d = Dir.new("testdir") #=> #<Dir:0x401b3c40> * d.read #=> "." * i = d.tell #=> 12 * d.read #=> ".." * d.seek(i) #=> #<Dir:0x401b3c40> * d.read #=> ".." */ static VALUE dir_seek(VALUE dir, VALUE pos) { struct dir_data *dirp; off_t p = NUM2OFFT(pos); GetDIR(dir, dirp); #ifdef HAVE_SEEKDIR seekdir(dirp->dir, p); return dir; #else rb_notimplement(); #endif }
/* * call-seq: * dir.pos => integer * dir.tell => integer * * Returns the current position in <em>dir</em>. See also * <code>Dir#seek</code>. * * d = Dir.new("testdir") * d.tell #=> 0 * d.read #=> "." * d.tell #=> 12 */ static VALUE dir_tell(VALUE dir) { #ifdef HAVE_TELLDIR struct dir_data *dirp; long pos; GetDIR(dir, dirp); pos = telldir(dirp->dir); return rb_int2inum(pos); #else rb_notimplement(); #endif }
/* * call-seq: * dir.each { |filename| block } => dir * * Calls the block once for each entry in this directory, passing the * filename of each entry as a parameter to the block. * * d = Dir.new("testdir") * d.each {|x| puts "Got #{x}" } * * <em>produces:</em> * * Got . * Got .. * Got config.h * Got main.rb */ static VALUE dir_each(VALUE dir) { struct dir_data *dirp; struct dirent *dp; RETURN_ENUMERATOR(dir, 0, 0); GetDIR(dir, dirp); rewinddir(dirp->dir); for (dp = readdir(dirp->dir); dp != NULL; dp = readdir(dirp->dir)) { rb_yield(dir_enc_str(rb_tainted_str_new(dp->d_name, NAMLEN(dp)), dirp)); if (dirp->dir == NULL) dir_closed(); } return dir; }
/* * call-seq: * dir.read => string or nil * * Reads the next entry from <em>dir</em> and returns it as a string. * Returns <code>nil</code> at the end of the stream. * * d = Dir.new("testdir") * d.read #=> "." * d.read #=> ".." * d.read #=> "config.h" */ static VALUE dir_read(VALUE dir) { struct dir_data *dirp; struct dirent *dp; GetDIR(dir, dirp); errno = 0; dp = readdir(dirp->dir); if (dp) { return dir_enc_str(rb_tainted_str_new(dp->d_name, NAMLEN(dp)), dirp); } else if (errno == 0) { /* end of stream */ return Qnil; } else { rb_sys_fail(0); } return Qnil; /* not reached */ }