EiffelBase class
(HTML page generated by ISE Eiffel 4.2)
Eiffel Class
indexing
description: "Directories, in the Unix sense, with creation and exploration features";
status: "See notice at end of class";
date: "$Date: 2007-03-30 19:10:11 +0000 (Fri, 30 Mar 2007) $";
revision: "$Revision: 95354 $"
class DIRECTORY
inherit
MEMORY
export
{NONE} all
redefine
dispose
end
creation
make,
make_open_read
feature -- Initialization
make (dn: STRING) is
-- Create directory object for the directory
-- of name dn.
require
string_exists: dn /= void
do
name := dn;
mode := close_directory
end;
make_open_read (dn: STRING) is
-- Create directory object for the directory
-- of name dn and open it for reading.
require
string_exists: dn /= void
do
make (dn);
open_read
end;
create is
-- Create a physical directory.
require
physical_not_exists: notexists
local
external_name: ANY
do
external_name := name.to_c;
file_mkdir ($external_name)
end;
feature -- Access
readentry is
-- Read next directory entry;
-- make result available in lastentry.
-- Make result void if all entries have been read.
require
is_opened: notis_closed
do
lastentry := dir_next (directory_pointer)
end;
name: STRING;
-- Directory name
has_entry (entry_name: STRING): BOOLEAN is
-- Has directory the entry entry_name?
-- The use of dir_temp is required not
-- to change the position in the current
-- directory entries list.
require
string_exists: entry_name /= void
local
ext_entry_name: ANY;
dir_temp: DIRECTORY
do
create dir_temp.make_open_read (name);
ext_entry_name := entry_name.to_c;
Result := dir_temp.dir_search (dir_temp.directory_pointer, $ext_entry_name) /= default_pointer;
dir_temp.close
end;
open_read is
-- Open directory name for reading.
local
external_name: ANY
do
external_name := name.to_c;
directory_pointer := dir_open ($external_name);
mode := read_directory
end;
close is
-- Close directory.
require
is_open: notis_closed
do
dir_close (directory_pointer);
mode := close_directory
end;
start is
-- Go to first entry of directory.
require
is_opened: notis_closed
do
dir_rewind (directory_pointer)
end;
change_name (new_name: STRING) is
-- Change file name to new_name
require
not_new_name_void: new_name /= void;
file_exists: exists
local
ext_old_name, ext_new_name: ANY
do
ext_old_name := name.to_c;
ext_new_name := new_name.to_c;
eif_dir_rename ($ext_old_name, $ext_new_name);
name := new_name
ensure
name_changed: name.is_equal (new_name)
end;
feature -- Measurement
count: INTEGER is
-- Number of entries in directory.
require
directory_exists: exists
local
dir_temp: DIRECTORY;
counter: INTEGER
do
create dir_temp.make_open_read (name);
from
dir_temp.start;
dir_temp.readentry
until
dir_temp.lastentry = void
loop
counter := counter + 1;
dir_temp.readentry
end;
Result := counter;
dir_temp.close
end;
feature -- Conversion
linear_representation: ARRAYED_LIST [STRING] is
-- The entries, in sequential format.
local
dir_temp: DIRECTORY
do
create dir_temp.make_open_read (name);
create Result.make (count);
from
dir_temp.start;
dir_temp.readentry
until
dir_temp.lastentry = void
loop
Result.extend (dir_temp.lastentry);
dir_temp.readentry
end;
dir_temp.close
end;
feature -- Status report
lastentry: STRING;
-- Last entry read by readentry
is_closed: BOOLEAN is
-- Is current directory closed?
do
Result := mode = close_directory
end;
empty: BOOLEAN is
-- Is directory empty?
require
directory_exists: exists
do
Result := (count = 0)
end;
exists: BOOLEAN is
-- Does the directory exist?
local
external_name: ANY
do
external_name := name.to_c;
Result := eif_dir_exists ($external_name)
end;
is_readable: BOOLEAN is
-- Is the directory readable?
require
directory_exists: exists
local
external_name: ANY
do
external_name := name.to_c;
Result := eif_dir_is_readable ($external_name)
end;
is_executable: BOOLEAN is
-- Is the directory executable?
require
directory_exists: exists
local
external_name: ANY
do
external_name := name.to_c;
Result := eif_dir_is_executable ($external_name)
end;
is_writable: BOOLEAN is
-- Is the directory writable?
require
directory_exists: exists
local
external_name: ANY
do
external_name := name.to_c;
Result := eif_dir_is_writable ($external_name)
end;
feature -- Removal
delete is
-- Delete directory if empty
require
directory_exists: exists;
empty_directory: empty
local
external_name: ANY
do
external_name := name.to_c;
eif_dir_delete ($external_name)
end;
dispose is
-- Ensure this medium is closed when garbage collected.
do
if notis_closed then
close
end
end;
feature {DIRECTORY} -- Implementation
directory_pointer: POINTER;
-- Directory pointer as required in C
dir_search (dir_ptr: POINTER; entry: POINTER): POINTER is
-- Return the DIRENTRY structure corresponding
-- to the name entry of directory dir_ptr.
external
"C | %"eif_dir.h%""
end;
feature {NONE} -- Implementation
mode: INTEGER;
-- Status mode of the directory.
-- Possible values are the following:
Close_directory: INTEGER is unique;
Read_directory: INTEGER is unique;
file_mkdir (dir_name: POINTER) is
-- Make directory dir_name.
external
"C | %"eif_file.h%""
end;
dir_open (dir_name: POINTER): POINTER is
-- Open the directory dir_name.
external
"C | %"eif_dir.h%""
end;
dir_rewind (dir_ptr: POINTER) is
-- Rewind the directory dir_ptr.
external
"C | %"eif_dir.h%""
end;
dir_close (dir_ptr: POINTER) is
-- Close the directory dir_ptr.
external
"C | %"eif_dir.h%""
end;
dir_next (dir_ptr: POINTER): STRING is
-- Return the next entry for directory 'dir_ptr'.
external
"C | %"eif_dir.h%""
end;
eif_dir_delete (dir_name: POINTER) is
-- Delete the directory dir_name.
external
"C | %"eif_dir.h%""
end;
eif_dir_exists (dir_name: POINTER): BOOLEAN is
-- Does the directory dir_name exist?
external
"C | %"eif_dir.h%""
end;
eif_dir_is_readable (dir_name: POINTER): BOOLEAN is
-- Is dir_name readable?
external
"C | %"eif_dir.h%""
end;
eif_dir_is_executable (dir_name: POINTER): BOOLEAN is
-- Is dir_name executable?
external
"C | %"eif_dir.h%""
end;
eif_dir_is_writable (dir_name: POINTER): BOOLEAN is
-- Is dir_name writable?
external
"C | %"eif_dir.h%""
end;
eif_dir_rename (old_name, new_name: POINTER) is
-- Change directory name from old_name to new_name.
external
"C | %"eif_file.h%""
alias
"file_rename"
end;
end -- class DIRECTORY
|